Benutzerdefinierte Tokens erstellen

In diesem Dokument wird gezeigt, wie Sie mit Identity Platform benutzerdefinierte JSON-Web-Tokens (JWTs) erstellen.

Mit benutzerdefinierten Tokens haben Sie die vollständige Kontrolle über den Authentifizierungsprozess. Sie generieren diese Tokens auf Ihrem Server, übergeben sie an ein Clientgerät und rufen dann signInWithCustomToken() auf, um sich anzumelden.

Sie können benutzerdefinierte Tokens mit dem Identity Platform Admin SDK erstellen oder die JWT-Bibliothek eines Drittanbieters verwenden.

Hinweis

  • Installieren Sie das Admin SDK. Wenn Sie die automatische Dienstkontoerkennung oder eine explizit angegebene Dienstkonto-ID verwenden, muss das verwendete Dienstkonto mindestens die Rolle „Dienstkonto-Token-Ersteller“ (roles/iam.serviceAccountTokenCreator) haben.

  • Erstellen Sie einen Serverendpunkt, der Anmeldedaten von Nutzern akzeptiert.

Benutzerdefinierte Tokens mit dem Admin SDK erstellen

Das Admin SDK verfügt über eine integrierte Methode zum Erstellen benutzerdefinierter Tokens. Sie müssen mindestens einen uid angeben. Dies kann ein beliebiger String sein, der den Nutzer oder das Gerät eindeutig identifiziert. Diese Tokens laufen nach einer Stunde ab.

Das folgende Beispiel zeigt, wie ein benutzerdefiniertes Token erstellt wird:

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

Nachdem Sie ein benutzerdefiniertes Token erstellt haben, kann Ihre Anwendung damit einen Nutzer anmelden.

Optional können Sie weitere Anforderungen für das benutzerdefinierte Token hinzufügen. Diese werden an das ID-Token des Nutzers als Anforderungen auf oberster Ebene weitergegeben.

Das folgende Beispiel zeigt, wie Sie eine premiumAccount-Anforderung hinzufügen:

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 entspricht der JWT-Spezifikation von OpenID Connect. Dies bedeutet, dass die folgenden Anforderungen reserviert sind und nicht angegeben werden können:

  • acr
  • amr
  • at_hash
  • aud
  • auth_time
  • azp
  • cnf
  • c_hash
  • exp
  • firebase
  • iat
  • iss
  • jti
  • nbf
  • nonce
  • sub

Benutzerdefinierte Tokens mit der JWT-Bibliothek eines Drittanbieters erstellen

Wenn Ihr Back-End in einer Sprache geschrieben ist, die vom Admin SDK nicht unterstützt wird, können Sie trotzdem benutzerdefinierte Tokens manuell erstellen. Suchen Sie zuerst nach einer JWT-Bibliothek eines Drittanbieters für Ihre Sprache. Verwenden Sie dann diese Bibliothek, um ein JWT zu reduzieren, das die folgenden Anforderungen enthält:

alg Algorithmus "RS256"
iss Aussteller Die E-Mail-Adresse des Dienstkontos Ihres Projekts.
sub Betreff Die E-Mail-Adresse des Dienstkontos Ihres Projekts.
aud Zielgruppe "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit"
iat Ausstellungszeit Die aktuelle Zeit in Sekunden seit der UNIX-Epoche.
exp Ablaufzeit Die Zeit in Sekunden seit der UNIX-Epoche, zu der das Token abläuft. Dies kann maximal 3.600 Sekunden später als iat sein.
Beachten Sie, dass damit nur der Zeitpunkt gesteuert wird, zu dem das benutzerdefinierte Token selbst abläuft. Wenn Sie einen Nutzer mit signInWithCustomToken() angemeldet haben, bleibt er so lange angemeldet, bis er sich wieder abmeldet oder seine Sitzung ungültig wird.
uid Die eindeutige Kennung des angemeldeten Nutzers. Muss ein String mit 1 bis 36 Zeichen sein.
claims (optional) Zusätzliche benutzerdefinierte Anforderungen, die hinzugefügt werden sollen.

Die folgenden Beispiele veranschaulichen, wie Sie benutzerdefinierte Tokens in Sprachen erstellen, die vom Admin SDK nicht unterstützt wird:

PHP

Mit 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

Mit 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

Nachdem Sie ein benutzerdefiniertes Token erstellt haben, kann Ihre Anwendung damit einen Nutzer anmelden.

Nächste Schritte