如何解决尝试使用Firebase Admin SDK创建“自定义令牌”的“呼叫者没有权限” 错误配置
错误
致电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角色即可解决此问题。
解决方法
您需要确保授权了SDK的服务帐户(不是指定为serviceAccountId
的服务帐户)具有令牌创建者角色。这是由Google应用程序默认凭据自动发现的服务帐户。对于Cloud Functions,这是名为{project-name}@appspot.gserviceaccount.com
的服务帐户。您需要找出GKE的等效服务帐户,并为其授予令牌创建者角色。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。