微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试使用Firebase Admin SDK创建“自定义令牌”的“呼叫者没有权限” 错误配置

如何解决尝试使用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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?