【问题标题】:"Caller does not have permission" trying to create custom token with Firebase Admin SDK“调用者没有权限”尝试使用 Firebase Admin SDK 创建自定义令牌
【发布时间】:2020-12-02 17:42:22
【问题描述】:

错误

调用admin.auth().createCustomToken() 时出现以下错误:

Error: The caller does not have permission; Please refer to https://firebase.google.com/docs/auth/admin/create-custom-tokens for more details on how to use and troubleshoot this feature.

提供的文档让我相信我用来初始化 Firebase Admin SDK 的服务帐户没有足够的权限。我不相信是这样,所以我想问问看我是否遗漏了什么。

配置

Firebase Admin SDK 在后端初始化如下:

admin.initializeApp({
  serviceAccountId: 'firebase-adminsdk-xxxxx@my-project-id.iam.gserviceaccount.com'
});

从技术上讲,该值是从 env var 中引用的,但我已确认该值是正确的。

正在使用的服务帐号具有以下角色:

roles/firebase.sdkAdminServiceAgent
roles/iam.serviceAccountTokenCreator

根据文档,创建自定义令牌所需的权限是 iam.serviceAccounts.signBlob。根据此输出,此权限是 iam.serviceAccountTokenCreator 角色的一部分:

❯ gcloud beta iam roles describe roles/iam.serviceAccountTokenCreator
description: Impersonate service accounts (create OAuth2 access tokens, sign blobs
  or JWTs, etc).
etag: AA==
includedPermissions:
- iam.serviceAccounts.get
- iam.serviceAccounts.getAccessToken
- iam.serviceAccounts.getOpenIdToken
- iam.serviceAccounts.implicitDelegation
- iam.serviceAccounts.list
- iam.serviceAccounts.signBlob
- iam.serviceAccounts.signJwt
- resourcemanager.projects.get
- resourcemanager.projects.list
name: roles/iam.serviceAccountTokenCreator
stage: GA
title: Service Account Token Creator

最后,出错的代码如下:

try {
  const loginToken = await admin.auth().createCustomToken(uid);
  return response(200).json({ loginToken });
} catch (err) {
  ...
}

uid 来自通过 GoogleUser 凭据登录用户 - 确认提供的 uid 是准确的,当为同一服务帐户引用 JSON 密钥文件时,此流程在本地工作。

服务器在 GKE 上运行,以防可能是集群权限错误。

任何帮助将不胜感激!

编辑 - 已解决 Hiranya 的回答成功了——K8s 部署已经配置了一个服务帐户,其最初的意图只是启用 Cloud SQL 代理。为这个服务帐号提供 serviceAccountTokenCreator 角色解决了这个问题。

【问题讨论】:

    标签: node.js firebase firebase-authentication google-kubernetes-engine firebase-admin


    【解决方案1】:

    您需要确保授权 SDK 的服务帐户(不是指定为 serviceAccountId 的服务帐户)具有令牌创建者角色。这是 Google 应用程序默认凭据自动发现的服务帐户。对于 Cloud Functions,这是名为 {project-name}@appspot.gserviceaccount.com 的服务帐户。您需要找出 GKE 的等效服务帐户,并授予其令牌创建者角色。

    【讨论】:

    • 对我来说,它仅在我开​​始尝试为每个成员添加“服务帐户令牌创建者”角色时才有效。添加到我自己(所有者)之后,它似乎可以工作
    • @AlissonNunes 也对我有用!非常感谢
    • 事实证明,GCP 不会立即传播角色更改,新权限可能需要几分钟才能生效。如果您没有立即看到Service Account Token Creator 工作的{project-name}@appspot.gserviceaccount.com 帐户,请尝试等待几分钟,然后重试。 (删除之前的评论)
    • 尝试如上所述将服务帐户令牌创建者角色添加到应用程序角色,但没有成功,但将角色添加到所有者帐户也对我有用。
    • 确认它适用于 @AlissonNunes 注释。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-11-14
    • 2018-10-02
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 2017-08-13
    相关资源
    最近更新 更多