Creazione di token personalizzati
Questo documento mostra come utilizzare Identity Platform per creare file JSON Web personalizzati i token (JWT).
I token personalizzati ti consentono di avere il controllo completo sulla procedura di autenticazione. Tu
generare questi token sul server, ritrasmetterli a un dispositivo client e
quindi chiama signInWithCustomToken()
per consentire agli utenti di eseguire l'accesso.
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 dell'account di servizio o un ID account di servizio specificato esplicitamente, assicurati che l'account di servizio in uso disponga almeno del ruolo Creatore token account di servizio (
roles/iam.serviceAccountTokenCreator
).Crea ed esegui il deployment di un endpoint server che accetta le credenziali di accesso da utenti.
Creazione di token personalizzati mediante 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.
L'esempio seguente 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)
Vai
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.
Facoltativamente, puoi includere ulteriori rivendicazioni sul token personalizzato. Si tratta di propagate al token ID dell'utente come rivendicazioni di primo livello.
L'esempio seguente mostra come aggiungere una rivendicazione 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)
Vai
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 i seguenti indicatori sono riservati e non possono essere specificati:
acr
amr
at_hash
aud
auth_time
azp
cnf
c_hash
exp
firebase
iat
iss
jti
nbf
nonce
sub
Creazione di token personalizzati utilizzando una libreria JWT di terze parti
Se il tuo backend è scritto in un linguaggio non supportato da SDK Admin, puoi comunque creare token personalizzati manualmente. Per prima cosa, trovare una libreria JWT di terze parti per la tua lingua. Quindi, utilizza la libreria per creare un JWT che includa i seguenti claim:
alg |
Algoritmo | "RS256" |
iss |
Emittente | L'indirizzo email dell'account di servizio del progetto. |
sub |
Oggetto | L'indirizzo email dell'account di servizio del progetto. |
aud |
Pubblico | "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit" |
iat |
Emesso il momento | L'ora corrente, in secondi, dall'epoca UNIX. |
exp |
Scadenza |
La data e l'ora in cui scade il token, espresse in secondi dall'epoca UNIX. Deve essere al massimo 3600 secondi dopo il valore iat .
Tieni presente che questo controlla solo la scadenza del token personalizzato stesso. Una volta che un utente ha eseguito l'accesso con signInWithCustomToken() , l'accesso rimarrà attivo finché
non uscirà o la sessione non verrà 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. |
I seguenti esempi mostrano come creare token personalizzati nei linguaggi l'SDK Admin non supporta:
PHP
In 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 eseguire l'accesso con un utente.
Passaggi successivi
- Eseguire l'accesso degli utenti con token personalizzati.
- Configura rivendicazioni personalizzate sugli utenti.
- Utilizza l'API REST per integrare Identity Platform con altre parti del tuo sistema di autenticazione personalizzato.