node.js - Firebase-autentisering fungerer ikke med ADC (Application Default Credentials)
Jeg bruker Firebase Admin SDK fra min utviklingsmaskin (Node.js/Fastify). Så jeg prøver å gjøre noe som dette:
Initialiser Firebase-app 👇:
import * as firebaseAdmin from 'firebase-admin'
import { applicationDefault } from 'firebase-admin/app'
firebaseAdmin.initializeApp({
projectId: '<FIREBASE-PROJECT-ID>',
credential: applicationDefault(),
})
export default firebaseAdmin
Så når jeg bruker min "firebaseAdmin" (for eksempel👇):
import firebaseAdmin from '../../../firebase-admin'
import { FastifyInstance, FastifyPluginAsync, FastifyReply, FastifyRequest } from 'fastify'
const myRoutes: FastifyPluginAsync<AppOptions> = async (fastify: FastifyInstance) => {
fastify.post<{ Body: { uid: string } }>(
`/token`,
async (request: FastifyRequest<{ Body: { uid: string } }>, reply: FastifyReply) => {
const { uid } = request.body
try {
const customToken = await firebaseAdmin.auth().createCustomToken(uid)
return reply.send({ token: customToken })
} catch (error: unknown) {
if (error instanceof Error) {
app.log.error('Error creating custom token:', {
name: error.name,
stack: error.stack,
message: error.message,
})
return reply
.code(500)
.send({ message: 'Failed to create token', error: error.message })
} else {
app.log.error('Unknown error creating custom token:', error)
return reply
.code(500)
.send({ message: 'Failed to create token', error: 'Unknown error' })
}
}
},
)
})
export default myRoutes
Får alltid denne feilen:
Kunne ikke fastslå tjenestekonto. Sørg for å initialisere SDK-en med legitimasjon for tjenestekonto. Alternativt kan du spesifisere en tjenestekonto med iam.serviceAccounts.signBlob-tillatelse. Original feil: Feil: Feil under forespørsel: getaddrinfo ENOTFOUND metadata. Feilkode: ENOTFOUND
Jeg vet at jeg ikke bruker en tjenestekonto; hvis jeg gjorde det, ville jeg bare gjort noe sånt som dette (som fungerer perfekt):
import * as firebaseAdmin from 'firebase-admin'
import { applicationDefault } from 'firebase-admin/app'
const serviceAccountPath = '/path/to/my/service-account.json'
firebaseAdmin.initializeApp({
credential: firebaseAdmin.credential.cert(serviceAccountPath),
})
export default firebaseAdmin
Men saken er at jeg ikke vil bruke en tjenestekonto. Jeg vil bruke ADC (Application Default Credentials) fra gcloud som ligger på:
~/.config/gcloud/application_default_credentials.jsonJeg prøver å forstå hvorfor disse påloggingsopplysningene ikke har tilgang til Firebase Auth. Hvordan kan jeg få det til å fungere? Er det i det hele tatt mulig?
Dette er hva jeg prøvde:
Jeg installerte Firebase CLI og prøvde å finne en annen standard fil for applikasjonslegitimasjon, noe sånt som:
~/.config/firebase/application_default_credentials.jsonJeg hadde tenkt å bruke den filen til å sette miljøvariabelen
GOOGLE_APPLICATION_CREDENTIALS. Jeg klarte imidlertid ikke å finne den filen, og jeg er ikke engang sikker på om den faktisk eksisterer.Jeg ga tillatelser som
Firebase Authentication Admin,Editor,Service Account Token Creatorog flere andre som jeg ikke husker. Det fungerte ikke. Det ser ut til at det ikke er et tillatelsesproblem.
Svar #1
Jeg fant dette akkurat i Firebase-dokumentasjonen 👇:
"Når man tester Admin SDK lokalt med Google Application Default Credentials oppnådd ved å kjøre gcloud auth application-default login, er ytterligere endringer nødvendige for å bruke Firebase Authentication på grunn av følgende:"
- Firebase Authentication aksepterer ikke gcloud-sluttbrukerlegitimasjon generert ved bruk av gcloud OAuth-klient-ID.
- Firebase Authentication krever at prosjekt-ID oppgis ved initialisering for denne typen sluttbrukerlegitimasjon.
Det ser ut til at det ikke er mulig å bruke Firebase Authentication med bare ADC fra Google Cloud. Ytterligere konfigurasjon kan være nødvendig for å få det til å fungere riktig.