打电话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: '[email protected]'
});
从技术上讲,该值是从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的等效服务帐户并将其授予令牌创建者角色。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句