“调用者没有权限”尝试使用 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 创建自定义令牌的主要内容,如果未能解决你的问题,请参考以下文章
使用服务器密钥时,Google Sheets API 返回“调用者没有权限”
错误: (gcloud.beta.functions.deploy) ... message=[调用者没有权限]
调用 GMAIL API 时出现间歇性错误 - “调用者没有权限”
无法从 Terraform 创建 App Engine 应用程序:调用者没有权限,被禁止
如何从 Google OAuth 2.0 Playground 运行 Google App Script 功能 |调用者没有权限