Creazione di token personalizzati

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

I token personalizzati ti offrono il controllo completo sul processo 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 che stai utilizzando abbia almeno l'account di servizio Ruolo Creatore token (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. Presso devi fornire almeno un valore uid. Può essere qualsiasi stringa che in modo univoco identifica 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 eseguire l'accesso con 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 alle Specifica JWT di 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 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, usa quella libreria per creare un JWT che includa i le seguenti rivendicazioni:

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 attuale, in secondi, dall'epoca di UNIX.
exp Scadenza Il tempo, in secondi, dall'epoca UNIX, in cui scade il token. it può essere di massimo 3600 secondi dopo rispetto a iat.
Tieni presente che questa opzione controlla solo l'ora in cui il token personalizzato scade. Quando un utente esegue l'accesso con signInWithCustomToken(), manterrà l'accesso fino al giorno esce o la sessione viene invalidata.
uid L'identificatore univoco dell'utente che ha eseguito l'accesso. Deve essere una stringa compresa tra 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

In 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