Creazione di token personalizzati

Questo documento mostra come utilizzare Identity Platform per creare token web JSON (JWT) personalizzati.

I token personalizzati ti consentono di avere il controllo completo sulla procedura di autenticazione. Puoi generare questi token sul tuo server, trasmetterli a un dispositivo client e poi chiamare signInWithCustomToken() per far accedere gli utenti.

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 e implementa un endpoint del server che accetti 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)

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.

Se vuoi, puoi includere altri claim nel token personalizzato. Questi vengono propagati al token ID dell'utente come claim 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 una lingua non supportata dall'SDK Amministrazione, puoi comunque creare manualmente token personalizzati. Innanzitutto, trova 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 Data/ora di emissione L'ora corrente, in secondi, dall'epoca UNIX.
exp Scadenza La data e l'ora in cui scade il token, espressa 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 si disconnette 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) Dichiarazioni personalizzate aggiuntive da includere.

Gli esempi riportati di seguito mostrano come creare token personalizzati nelle 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