firebase / firebase/firebase-admin-node

[DOC] Improve documentation for service account impersonation

Aperta
#2,812 3 commenti 0 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
TypeScript
Stelle
1.7k
Fork
419
Merge medio
3g 10h
PR unite (30g)
16

Descrizione

It seems like service account impersonation is the [recommended](https://cloud.google.com/docs/authentication/use-service-account-impersonation) way to authenticate for local development.

But it's not very clear how this is done in practice. Do I need to adapt my code for this?

I've run:
gcloud auth application-default login --impersonate-service-account SERVICE_ACCT_EMAIL
and I have a token in:
cat /Users/myuser/.config/gcloud/application_default_credentials.json
```json
{
"delegates": [],
"service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/myserviceaccount@myproject.iam.gserviceaccount.com:generateAccessToken",
"source_credentials": {
"account": "",
"client_id": "removed",
"client_secret": "removed",
"refresh_token": "removed",
"type": "authorized_user",
"universe_domain": "googleapis.com"
},
"type": "impersonated_service_account"
}
```

I have tried code like this (after having looked at #2800):
```ts
initializeApp({
storageBucket: config.firebase.storageBucket,
credential: cert(process.env['GOOGLE_APPLICATION_CREDENTIALS']),
projectId: config.firebase.projectId,
})
```

But then I got an error:
> FirebaseAppError: Failed to parse service account json file: Error: Service account object must contain a string "project_id" property.

and this, I assumed this would pick up the ADC credentials file, notice its impersonation, and things would just work:
```ts
initializeApp({
storageBucket: config.firebase.storageBucket,
credential: applicationDefault(),
projectId: config.firebase.projectId,
})
```

But then I got this error:
> "Getting metadata from plugin failed with error: Could not refresh access token: PERMISSION_DENIED: unable to impersonate: Permission 'iam.serviceAccounts.getAccessToken' denied on resource (or it may not exist).",

My local user has the Owner role in the GCP project. And has owner permissions on the service account. The service account has the `Service Account Token Creator` role.

Im using `firebase-admin` v13.0.1

Some working sample code for this would be very helpful.

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Start with the reported `gcloud auth application-default login --impersonate-service-account` flow and the `application_default_credentials.json` format, then compare it with the `initializeApp`, `cert`, and `applicationDefault` examples. Document a working local-development example for firebase-admin v13.0.1, including the required permission setup and what successful authentication looks like.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
gcp, nodejs, typescript
Ambito
authentication, cloud, documentation
Tipo di issue
Documentazione
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.