Creazione di token personalizzati
Questo documento mostra come utilizzare Identity Platform per creare token web JSON (JWT) personalizzati.
I token personalizzati ti consentono di controllare completamente la procedura di autenticazione. Generi questi token sul tuo server, li restituisci a un dispositivo client e poi chiami signInWithCustomToken() per consentire agli utenti di accedere.
Puoi creare token personalizzati con l'SDK Admin di Identity Platform o utilizzare una libreria JWT di terze parti.
Prima di iniziare
Installa l'SDK Admin. Se utilizzi il rilevamento automatico del account di servizio o un ID account di servizio specificato in modo esplicito, assicurati che il account di servizio che utilizzi disponga almeno del ruolo Creatore token service account (
roles/iam.serviceAccountTokenCreator).Crea e implementa un endpoint server che accetta le credenziali di accesso degli utenti.
Creazione di token personalizzati utilizzando l'SDK Admin
L'SDK Admin dispone di un metodo integrato per la creazione di token personalizzati. Come minimo, devi fornire un uid. Può essere qualsiasi stringa che identifichi in modo univoco l'utente o il dispositivo. Questi token scadono dopo un'ora.
Il seguente esempio mostra come creare un token personalizzato:
Node.js
const uid = 'some-uid'; getAuth() .createCustomToken(uid) .then((customToken) => { // Send token back to client }) .catch((error) => { console.log('Error creating custom token:', error); });
Java
String uid = "some-uid"; String customToken = FirebaseAuth.getInstance().createCustomToken(uid); // Send token back to client
Python
uid = 'some-uid' custom_token = auth.create_custom_token(uid)
Go
client, err := app.Auth(context.Background()) if err != nil { log.Fatalf("error getting Auth client: %v\n", err) } token, err := client.CustomToken(ctx, "some-uid") if err != nil { log.Fatalf("error minting custom token: %v\n", err) } log.Printf("Got custom token: %v\n", token)
C#
var uid = "some-uid"; string customToken = await FirebaseAuth.DefaultInstance.CreateCustomTokenAsync(uid); // Send token back to client
Dopo aver creato un token personalizzato, la tua app può utilizzarlo per far accedere un utente.
Se vuoi, puoi includere ulteriori rivendicazioni nel token personalizzato. Questi vengono propagato al token ID dell'utente come rivendicazioni di primo livello.
L'esempio seguente mostra come aggiungere un'attestazione premiumAccount:
Node.js
const userId = 'some-uid'; const additionalClaims = { premiumAccount: true, }; getAuth() .createCustomToken(userId, additionalClaims) .then((customToken) => { // Send token back to client }) .catch((error) => { console.log('Error creating custom token:', error); });
Java
String uid = "some-uid"; Map<String, Object> additionalClaims = new HashMap<String, Object>(); additionalClaims.put("premiumAccount", true); String customToken = FirebaseAuth.getInstance() .createCustomToken(uid, additionalClaims); // Send token back to client
Python
uid = 'some-uid' additional_claims = { 'premiumAccount': True } custom_token = auth.create_custom_token(uid, additional_claims)
Go
client, err := app.Auth(context.Background()) if err != nil { log.Fatalf("error getting Auth client: %v\n", err) } claims := map[string]interface{}{ "premiumAccount": true, } token, err := client.CustomTokenWithClaims(ctx, "some-uid", claims) if err != nil { log.Fatalf("error minting custom token: %v\n", err) } log.Printf("Got custom token: %v\n", token)
C#
var uid = "some-uid"; var additionalClaims = new Dictionary<string, object>() { { "premiumAccount", true }, }; string customToken = await FirebaseAuth.DefaultInstance .CreateCustomTokenAsync(uid, additionalClaims); // Send token back to client
Identity Platform è conforme alla specifica JWT di OpenID Connect. Ciò significa che le seguenti rivendicazioni sono riservate e non possono essere specificate:
acramrat_hashaudauth_timeazpcnfc_hashexpfirebaseiatissjtinbfnoncesub
Creazione di token personalizzati utilizzando una libreria JWT di terze parti
Se il tuo backend è scritto in una lingua non supportata dall'SDK Admin, puoi comunque creare manualmente token personalizzati. Innanzitutto, trova una libreria JWT di terze parti per la tua lingua. Quindi, utilizza questa libreria per creare un JWT che includa le seguenti attestazioni:
alg |
Algoritmo | "RS256" |
iss |
Emittente | L'indirizzo email dell'account di servizio del tuo progetto. |
sub |
Oggetto | L'indirizzo email dell'account di servizio del tuo progetto. |
aud |
Pubblico | "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit" |
iat |
Ora di emissione | L'ora attuale, in secondi, dall'epoca UNIX. |
exp |
Scadenza |
Il tempo, in secondi dall'epoca UNIX, in cui il token scade. Può
essere al massimo 3600 secondi dopo iat.
Tieni presente che questa impostazione controlla solo la scadenza del token personalizzato. Una volta che un utente ha eseguito l'accesso con signInWithCustomToken(), l'accesso rimane attivo finché
l'utente non esce o la sessione non viene invalidata.
|
uid |
L'identificatore univoco dell'utente che ha eseguito l'accesso. Deve essere una stringa con una lunghezza compresa tra 1 e 36 caratteri. | |
claims (facoltativo) |
Ulteriori rivendicazioni personalizzate da includere. |
Gli esempi riportati di seguito mostrano come creare token personalizzati in lingue non supportate dall'SDK Admin:
PHP
Utilizzo di php-jwt:
// Requires: composer require firebase/php-jwt
use Firebase\JWT\JWT;
// Get your service account's email address and private key from the JSON key file
$service_account_email = "abc-123@a-b-c-123.iam.gserviceaccount.com";
$private_key = "-----BEGIN PRIVATE KEY-----...";
function create_custom_token($uid, $is_premium_account) {
global $service_account_email, $private_key;
$now_seconds = time();
$payload = array(
"iss" => $service_account_email,
"sub" => $service_account_email,
"aud" => "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
"iat" => $now_seconds,
"exp" => $now_seconds+(60*60), // Maximum expiration time is one hour
"uid" => $uid,
"claims" => array(
"premium_account" => $is_premium_account
)
);
return JWT::encode($payload, $private_key, "RS256");
}
Ruby
Utilizzo di ruby-jwt:
require "jwt"
# Get your service account's email address and private key from the JSON key file
$service_account_email = "service-account@my-project-abc123.iam.gserviceaccount.com"
$private_key = OpenSSL::PKey::RSA.new "-----BEGIN PRIVATE KEY-----\n..."
def create_custom_token(uid, is_premium_account)
now_seconds = Time.now.to_i
payload = {:iss => $service_account_email,
:sub => $service_account_email,
:aud => "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
:iat => now_seconds,
:exp => now_seconds+(60*60), # Maximum expiration time is one hour
:uid => uid,
:claims => {:premium_account => is_premium_account}}
JWT.encode payload, $private_key, "RS256"
end
Dopo aver creato un token personalizzato, la tua app può utilizzarlo per far accedere un utente.
Passaggi successivi
- Esegui l'accesso degli utenti con token personalizzati.
- Configura attestazioni personalizzate per gli utenti.
- Utilizza l'API REST per integrare Identity Platform con altre parti del tuo sistema di autenticazione personalizzato.