检索秘密firebase服务帐户json



我在nextjs中有这样的代码,它应该检查令牌是否有效,然后登录用户。

const firebaseAdmin = require("firebase-admin");
const serviceAccount = require ('../secret.json');
export const verifyIdToken = async (token) => {
if (!firebaseAdmin.apps.length) {

firebaseAdmin.initializeApp({
// credential: firebaseAdmin.credential.cert(serviceAccount),
credential: firebaseAdmin.credential.applicationDefault(),
databaseURL: "rtdb.firebaseio.com",
});
}
return await firebaseAdmin
.auth()
.verifyIdToken(token)
.catch((error) => {
throw error;
});

};

我将windows环境变量设置为firebase建议的,并切换为使用applicationDefault(),因为据我所知,

ADC可以自动查找您的凭证

问题是应用程序只能在本地工作。当我部署网站时,令牌没有经过验证并会产生错误。我通过云功能为NextJs应用程序提供服务。我该如何解决这个问题。错误为

auth/invalid-credential
Must initialize app with a cert credential or set your Firebase project
ID as the GOOGLE_CLOUD_PROJECT environment variable to call verifyIdToken().

该应用程序应该做的是在服务器端进行检查,以确定令牌是否有效。如下

export async function getServerSideProps(ctx) {
try {
const cookies = nookies.get(ctx);
const token = await verifyIdToken(cookies.token);
// the user is authenticated!
const { uid, email } = token;

return {
props: {
userData: {
email: email,
uid: uid,

},
},
};
} catch (err) {
console.log(err.code)
console.log(err.message)
return { props: {
} };
}
}

auth/valid credential 错误消息意味着Admin SDK需要初始化,正如我们在官方文档中看到的那样。

用于验证Admin SDK的凭据不能用于执行所需的动作。某些身份验证方法,例如createCustomToken((和verifyIdToken((要求SDK使用证书凭据初始化,而不是刷新令牌或应用程序默认凭据。

对于ID令牌验证,需要项目ID。Firebase Admin SDK尝试通过以下方法之一获取项目ID:

  • 如果使用显式projectId应用程序选项初始化SDK,则SDK将使用该选项的值
  • 如果SDK是用服务帐户凭据初始化的,则SDK将使用服务帐户JSON对象的project_id字段
  • 如果设置了GOOGLE_CLOUD_PROJECT环境变量,SDK将使用其值作为项目ID。此环境变量可用于在谷歌基础设施(如应用程序引擎和计算引擎(上运行的代码

因此,我们可以使用服务初始化Admin SDK(并完成第二个选项(;但是,首先要做的是验证服务帐户并授权其访问Firebase服务,您必须生成JSON格式的私钥文件。

要为您的服务帐户生成私钥文件,您可以执行以下操作:

  1. 在Firebase控制台中,打开"设置">服务帐户
  2. 单击生成新私钥,然后单击生成密钥进行确认
  3. 安全地存储包含密钥的JSON文件

一旦您有了JSON文件,您就可以设置一个环境变量来保存您的私钥。

export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"

然后,在你的代码中使用它,如下所示:

admin.initializeApp({
credential: admin.credential.applicationDefault(),
databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
});

最后,我下载了Gcloud工具,并从该工具中设置了GOOGLE_APPLICATION_CREDENTIALS环境变量。然后,该功能可以与credential: firebaseAdmin.credential.applicationDefault(),一起工作

最新更新