【问题标题】:retrieve secret firebase service account json检索秘密 Firebase 服务帐户 json
【发布时间】:2021-08-12 06:07:06
【问题描述】:

我在 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(),因为我是understand

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: {
    } };
  }
}

【问题讨论】:

  • 有什么错误?网站运行在什么类型的服务上?使用更多详细信息编辑您的问题。
  • 我已经添加了错误日志。我正在使用 NextJS 通过云功能提供服务
  • 你最近更新了firebase-admin的安装版本吗? GOOGLE_CLOUD_PROJECT 环境变量不适用于较新的 Cloud Functions 部署
  • 我使用的是最新的 firebase-admin 9.8.0。较新的部署是什么意思

标签: node.js google-cloud-platform google-cloud-functions next.js


【解决方案1】:

最后,我下载了 Gcloud 工具并从该工具中设置了 GOOGLE_APPLICATION_CREDENTIALS 环境变量。然后该函数可以使用credential: firebaseAdmin.credential.applicationDefault(),

【讨论】:

    【解决方案2】:

    auth/invalid-credential 错误信息意味着需要初始化Admin SDK,正如我们在@987654321 中看到的那样@。

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

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

    • 如果 SDK 使用显式 projectId 应用选项初始化,则 SDK 使用该选项的值。
    • 如果 SDK 是使用服务帐号凭据初始化的,则 SDK 使用服务帐号 JSON 对象的 project_id 字段。
    • 如果设置了 GOOGLE_CLOUD_PROJECT 环境变量,SDK 使用其值作为项目 ID。此环境变量可用于在 Google 基础架构(例如 App Engine 和 Compute Engine)上运行的代码。

    所以,我们可以initialize the Admin SDK 提供服务(并实现第二个选项);但是,首先要做的是验证服务帐户并授权它访问 Firebase 服务,您必须生成 JSON 格式的私钥文件。

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

    1. 在 Firebase 控制台中,打开设置 > 服务帐户。
    2. 点击 Generate New Private Key,然后点击 Generate Key 确认。
    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'
    });
    

    【讨论】:

      猜你喜欢
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      • 2016-06-26
      • 1970-01-01
      • 2018-06-30
      • 2017-09-29
      • 1970-01-01
      相关资源
      最近更新 更多