12 votes

"L'appelant n'a pas la permission de créer un jeton personnalisé avec Firebase Admin SDK.

Erreur

Lors de l'appel admin.auth().createCustomToken() Je reçois l'erreur suivante :

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.

La documentation fournie me laisse penser que le compte de service avec lequel j'initialise le Firebase Admin SDK n'a pas les permissions suffisantes. Je ne pense pas que ce soit le cas, c'est pourquoi je souhaite poser des questions et voir si j'ai manqué quelque chose.

Configuration

Firebase Admin SDK est initialisé dans le backend comme suit :

admin.initializeApp({
  serviceAccountId: 'firebase-adminsdk-xxxxx@my-project-id.iam.gserviceaccount.com'
});

Techniquement, la valeur est référencée à partir d'une variable d'environnement, mais j'ai confirmé que cette valeur était correcte.

Le compte de service utilisé a les rôles suivants :

roles/firebase.sdkAdminServiceAgent
roles/iam.serviceAccountTokenCreator

Selon la documentation, l'autorisation requise pour créer des jetons personnalisés est la suivante iam.serviceAccounts.signBlob . Cette autorisation fait partie de la iam.serviceAccountTokenCreator selon ce résultat :

 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

Enfin, le code en question qui provoque l'erreur est le suivant :

try {
  const loginToken = await admin.auth().createCustomToken(uid);
  return response(200).json({ loginToken });
} catch (err) {
  ...
}

L'identifiant provient de la connexion d'un utilisateur via un identifiant GoogleUser - l'exactitude de l'identifiant fourni est confirmée, et ce flux fonctionne localement lorsqu'il fait référence à un fichier clé JSON pour le même compte de service.

Le serveur fonctionne sur GKE, au cas où il s'agirait d'une erreur de permission de cluster.

Toute aide serait grandement appréciée !

EDIT - RÉSOLU La réponse de Hiranya a fait l'affaire - le déploiement de K8s avait été configuré avec un compte de service dont l'intention initiale était uniquement d'activer Cloud SQL Proxy. Le fait d'attribuer à ce compte de service le rôle serviceAccountTokenCreator a permis de résoudre le problème.

18voto

Hiranya Jayathilaka Points 2365

Vous devez vous assurer que le compte de service avec lequel le SDK est autorisé (et non celui spécifié en tant que serviceAccountId ) a le rôle de créateur de jetons. Il s'agit du compte de service découvert automatiquement par Google Application Default Credentials. Dans le cas des fonctions cloud, il s'agit du compte de service nommé {project-name}@appspot.gserviceaccount.com . Vous devez déterminer le compte de service équivalent pour GKE et lui attribuer le rôle de créateur de jetons.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X