“调用者没有权限”尝试使用 Firebase Admin SDK 创建自定义令牌

Posted

技术标签:

【中文标题】“调用者没有权限”尝试使用 Firebase Admin SDK 创建自定义令牌【英文标题】:"Caller does not have permission" trying to create custom token with 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 角色解决了这个问题。

【问题讨论】:

【参考方案1】:

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

【讨论】:

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

以上是关于“调用者没有权限”尝试使用 Firebase Admin SDK 创建自定义令牌的主要内容,如果未能解决你的问题,请参考以下文章

代码:403 消息:调用者没有权限

使用服务器密钥时,Google Sheets API 返回“调用者没有权限”

错误: (gcloud.beta.functions.deploy) ... message=[调用者没有权限]

调用 GMAIL API 时出现间歇性错误 - “调用者没有权限”

无法从 Terraform 创建 App Engine 应用程序:调用者没有权限,被禁止

如何从 Google OAuth 2.0 Playground 运行 Google App Script 功能 |调用者没有权限