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.