Creazione di token personalizzati

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

I token personalizzati ti offrono il controllo completo del processo di autenticazione. Devi generare questi token sul server, ritrasmetterli a un dispositivo client e chiamare signInWithCustomToken() per accedere agli utenti.

Puoi creare token personalizzati con l'SDK di amministrazione di Identity Platform o utilizzare una libreria JWT di terze parti.

Prima di iniziare

  • Installa l'SDK Admin. Se utilizzi la funzionalità di rilevamento automatico dell'account di servizio o un ID account di servizio specificato esplicitamente, assicurati che l'account di servizio che utilizzi abbia almeno il ruolo Creatore token account di servizio (roles/iam.serviceAccountTokenCreator).

  • Crea ed esegui il deployment di un endpoint del server che accetta le credenziali di accesso degli utenti.

Creare token personalizzati mediante l'SDK Admin

SDK Admin ha un metodo integrato per creare token personalizzati. Come minimo, devi fornire un uid. Può trattarsi di qualsiasi stringa che identifica 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)

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, l'app può utilizzarlo per accedere a un utente.

Se vuoi, puoi includere rivendicazioni aggiuntive sul token personalizzato. che vengono propagate al token ID dell'utente come attestazioni 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)

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 OpenID Connect. Ciò significa che le seguenti rivendicazioni sono riservate e non possono essere specificate:

  • 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 backend è scritto in un linguaggio non supportato da SDK Admin, puoi comunque creare manualmente i token personalizzati. Innanzitutto, trova una libreria JWT di terze parti per la tua lingua. Utilizza quindi quella libreria per generare un JWT che includa le seguenti attestazioni:

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 di emissione L'ora corrente, in secondi, dall'epoca di UNIX.
exp Scadenza Il tempo, in secondi, dall'epoca di UNIX, in cui scade il token. Può essere un massimo 3600 secondi dopo rispetto a iat.
Tieni presente che questa opzione controlla solo il tempo in cui il token personalizzato scade. Una volta eseguito l'accesso con signInWithCustomToken(), l'utente rimarrà connesso finché non esce dall'account o fino a quando la sua sessione non viene invalidata.
uid L'identificatore univoco dell'utente che ha eseguito l'accesso. Deve essere una stringa compresa tra 1 e 36 caratteri.
claims (facoltativo) Altre rivendicazioni personalizzate da includere.

I seguenti esempi mostrano come creare token personalizzati in linguaggi non supportati da SDK Admin:

PHP

Con 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

Con 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, l'app può utilizzarlo per accedere a un utente.

Passaggi successivi