Membuat token kustom

Dokumen ini menunjukkan cara menggunakan Identity Platform untuk membuat Token Web JSON (JWT) kustom.

Token kustom memberi Anda kontrol penuh atas proses autentikasi. Anda dapat membuat token ini di server, meneruskannya kembali ke perangkat klien, lalu memanggil signInWithCustomToken() untuk memproses login pengguna.

Anda dapat membuat token kustom dengan Identity Platform Admin SDK, atau menggunakan library JWT pihak ketiga.

Sebelum memulai

  • Instal Admin SDK. Jika Anda menggunakan penemuan otomatis akun layanan atau ID akun layanan yang ditentukan secara eksplisit, pastikan akun layanan yang Anda gunakan setidaknya memiliki peran Service Account Token Creator (roles/iam.serviceAccountTokenCreator).

  • Buat dan deploy endpoint server yang menerima kredensial login dari pengguna.

Membuat token kustom menggunakan Admin SDK

Admin SDK memiliki metode bawaan untuk membuat token kustom. Minimal, Anda harus memberikan uid. Ini dapat berupa string apa pun yang secara unik mengidentifikasi pengguna atau perangkat. Masa berlaku token ini akan berakhir setelah satu jam.

Contoh berikut menunjukkan cara membuat token kustom:

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

Setelah Anda membuat token kustom, aplikasi Anda dapat menggunakannya untuk membuat pengguna login.

Secara opsional, Anda dapat menyertakan klaim tambahan pada token kustom. Token ini diterapkan ke token ID pengguna sebagai klaim tingkat teratas.

Contoh berikut menunjukkan cara menambahkan klaim 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 mematuhi spesifikasi JWT OpenID Connect. Artinya, klaim berikut dicadangkan dan tidak dapat ditentukan:

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

Membuat token kustom menggunakan library JWT pihak ketiga

Jika backend Anda ditulis dalam bahasa yang tidak didukung Admin SDK, Anda masih dapat membuat token kustom secara manual. Pertama, temukan library JWT pihak ketiga untuk bahasa Anda. Kemudian, gunakan library tersebut untuk membuat JWT yang menyertakan klaim berikut:

alg Algoritme "RS256"
iss Penerbit Alamat email akun layanan project Anda.
sub Subjek Alamat email akun layanan project Anda.
aud Audiens "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit"
iat Waktu penerbitan Waktu saat ini, dalam satuan detik, sejak epoch UNIX.
exp Waktu habis masa berlaku Waktu saat token sudah tidak berlaku lagi, dalam satuan detik sejak epoch UNIX. Waktu ini bisa mencapai maksimum 3600 detik lebih lama daripada iat.
Perhatikan bahwa ini hanya mengontrol kapan token kustom berhenti berlaku. Setelah Anda memproses login pengguna dengan signInWithCustomToken(), pengguna akan tetap login hingga mereka logout atau validitas sesi mereka berakhir.
uid ID unik pengguna yang login. Harus berupa string dengan panjang antara 1-36 karakter.
claims (opsional) Klaim kustom tambahan yang akan disertakan.

Contoh berikut menunjukkan cara membuat token kustom dalam bahasa yang tidak didukung Admin SDK:

PHP

Menggunakan 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

Menggunakan 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

Setelah Anda membuat token kustom, aplikasi Anda dapat menggunakannya untuk membuat pengguna login.

Langkah selanjutnya