尝试使用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: '[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的等效服务帐户,并为其授予令牌创建者角色。