Se l'app client Firebase comunica con un server back-end personalizzato, potrebbe essere necessario identificare l'utente attualmente connesso su quel server. Per farlo in modo sicuro, dopo un accesso riuscito, invia il token ID dell'utente al tuo server utilizzando HTTPS. Quindi, sul server, verifica l'integrità e l'autenticità del token ID e recupera l' uid
da esso. Puoi utilizzare l' uid
trasmesso in questo modo per identificare in modo sicuro l'utente attualmente connesso al tuo server.
Prima di iniziare
Per verificare i token ID con Firebase Admin SDK, devi disporre di un account di servizio. Segui le istruzioni di configurazione dell'SDK di amministrazione per ulteriori informazioni su come inizializzare l'SDK di amministrazione con un account di servizio.
Recupera i token ID sui client
Quando un utente o un dispositivo accede correttamente, Firebase crea un token ID corrispondente che lo identifica in modo univoco e concede loro l'accesso a diverse risorse, come Firebase Realtime Database e Cloud Storage. Puoi riutilizzare quel token ID per identificare l'utente o il dispositivo sul tuo server back-end personalizzato. Per recuperare il token ID dal client, assicurati che l'utente abbia effettuato l'accesso e quindi ottieni il token ID dall'utente connesso:
iOS+
Obiettivo-C
FIRUser *currentUser = [FIRAuth auth].currentUser;
[currentUser getIDTokenForcingRefresh:YES
completion:^(NSString *_Nullable idToken,
NSError *_Nullable error) {
if (error) {
// Handle error
return;
}
// Send token to your backend via HTTPS
// ...
}];
Veloce
let currentUser = FIRAuth.auth()?.currentUser
currentUser?.getIDTokenForcingRefresh(true) { idToken, error in
if let error = error {
// Handle error
return;
}
// Send token to your backend via HTTPS
// ...
}
Androide
FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
mUser.getIdToken(true)
.addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
public void onComplete(@NonNull Task<GetTokenResult> task) {
if (task.isSuccessful()) {
String idToken = task.getResult().getToken();
// Send token to your backend via HTTPS
// ...
} else {
// Handle error -> task.getException();
}
}
});
Unità
Firebase.Auth.FirebaseUser user = auth.CurrentUser;
user.TokenAsync(true).ContinueWith(task => {
if (task.IsCanceled) {
Debug.LogError("TokenAsync was canceled.");
return;
}
if (task.IsFaulted) {
Debug.LogError("TokenAsync encountered an error: " + task.Exception);
return;
}
string idToken = task.Result;
// Send token to your backend via HTTPS
// ...
});
C++
firebase::auth::User user = auth->current_user();
if (user.is_valid()) {
firebase::Future<std::string> idToken = user.GetToken(true);
// Send token to your backend via HTTPS
// ...
}
ragnatela
firebase.auth().currentUser.getIdToken(/* forceRefresh */ true).then(function(idToken) {
// Send token to your backend via HTTPS
// ...
}).catch(function(error) {
// Handle error
});
Una volta che hai un token ID, puoi inviare quel JWT al tuo back-end e convalidarlo utilizzando Firebase Admin SDK o utilizzando una libreria JWT di terze parti se il tuo server è scritto in una lingua che Firebase non supporta in modo nativo.
Verifica i token ID utilizzando Firebase Admin SDK
Firebase Admin SDK ha un metodo integrato per la verifica e la decodifica dei token ID. Se il token ID fornito ha il formato corretto, non è scaduto ed è firmato correttamente, il metodo restituisce il token ID decodificato. Puoi prendere l' uid
dell'utente o del dispositivo dal token decodificato.
Segui le istruzioni di configurazione dell'SDK di amministrazione per inizializzare l'SDK di amministrazione con un account di servizio. Quindi, usa il metodo verifyIdToken()
per verificare un token ID:
Node.js
// idToken comes from the client app
getAuth()
.verifyIdToken(idToken)
.then((decodedToken) => {
const uid = decodedToken.uid;
// ...
})
.catch((error) => {
// Handle error
});
Giava
// idToken comes from the client app (shown above)
FirebaseToken decodedToken = FirebaseAuth.getInstance().verifyIdToken(idToken);
String uid = decodedToken.getUid();
Pitone
# id_token comes from the client app (shown above)
decoded_token = auth.verify_id_token(id_token)
uid = decoded_token['uid']
andare
client, err := app.Auth(ctx)
if err != nil {
log.Fatalf("error getting Auth client: %v\n", err)
}
token, err := client.VerifyIDToken(ctx, idToken)
if err != nil {
log.Fatalf("error verifying ID token: %v\n", err)
}
log.Printf("Verified ID token: %v\n", token)
C#
FirebaseToken decodedToken = await FirebaseAuth.DefaultInstance
.VerifyIdTokenAsync(idToken);
string uid = decodedToken.Uid;
La verifica del token ID richiede un ID progetto. Firebase Admin SDK tenta di ottenere un ID progetto tramite uno dei seguenti metodi:
- Se l'SDK è stato inizializzato con un'opzione dell'app
projectId
esplicita, l'SDK usa il valore di tale opzione. - Se l'SDK è stato inizializzato con le credenziali dell'account di servizio, l'SDK utilizza il campo
project_id
dell'oggetto JSON dell'account di servizio. - Se è impostata la variabile di ambiente
GOOGLE_CLOUD_PROJECT
, l'SDK ne utilizza il valore come ID progetto. Questa variabile di ambiente è disponibile per il codice in esecuzione sull'infrastruttura Google come App Engine e Compute Engine.
Verifica i token ID utilizzando una libreria JWT di terze parti
Se il tuo back-end è in una lingua non supportata da Firebase Admin SDK, puoi comunque verificare i token ID. Innanzitutto, trova una libreria JWT di terze parti per la tua lingua . Quindi, verifica l'intestazione, il carico utile e la firma del token ID.
Verificare che l'intestazione del token ID sia conforme ai seguenti vincoli:
Reclami di intestazione token ID | ||
---|---|---|
alg | Algoritmo | "RS256" |
kid | ID chiave | Deve corrispondere a una delle chiavi pubbliche elencate su https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com |
Verificare che il carico utile del token ID sia conforme ai seguenti vincoli:
Reclami sul carico utile del token ID | ||
---|---|---|
exp | Data di scadenza | Deve essere in futuro. Il tempo è misurato in secondi dall'epoca UNIX. |
iat | Rilasciato al momento | Deve essere nel passato. Il tempo è misurato in secondi dall'epoca UNIX. |
aud | Pubblico | Deve essere il tuo ID progetto Firebase, l'identificatore univoco per il tuo progetto Firebase, che può essere trovato nell'URL della console di quel progetto. |
iss | Emittente | Deve essere "https://securetoken.google.com/<projectId>" , dove <projectId> è lo stesso ID progetto utilizzato per aud sopra. |
sub | Materia | Deve essere una stringa non vuota e deve essere l' uid dell'utente o del dispositivo. |
auth_time | Tempo di autenticazione | Deve essere nel passato. L'ora in cui l'utente si è autenticato. |
Infine, assicurati che il token ID sia stato firmato dalla chiave privata corrispondente all'attestazione kid
del token. Prendi la chiave pubblica da https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com
e utilizza una libreria JWT per verificare la firma. Usa il valore di max-age
nell'intestazione Cache-Control
della risposta da quell'endpoint per sapere quando aggiornare le chiavi pubbliche.
Se tutte le verifiche di cui sopra hanno esito positivo, puoi utilizzare l'oggetto ( sub
) del token ID come uid
dell'utente o dispositivo corrispondente.