Membuat token kustom
Dokumen ini menunjukkan cara menggunakan Identity Platform untuk membuat Token Web JSON (JWT) kustom.
Token kustom memberi Anda kendali penuh atas proses autentikasi. Anda 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. Setidaknya, Anda harus memberikan uid
. String 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. Klaim ini disebarkan ke token ID pengguna sebagai klaim level 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 mencakup klaim berikut:
alg |
Algoritma | "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 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 .
Perlu diperhatikan bahwa ini hanya mengontrol kapan token kustom sudah tidak berlaku. Setelah Anda memproses login pengguna dengan signInWithCustomToken() , pengguna tersebut akan tetap login hingga
logout atau sesinya menjadi tidak valid.
|
uid |
ID unik pengguna yang login. Harus dalam bentuk string dengan panjang karakter antara 1-36. | |
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
- Memproses login pengguna dengan token kustom.
- Mengonfigurasi klaim kustom pada pengguna.
- Gunakan REST API untuk mengintegrasikan Identity Platform dengan bagian lain dari sistem autentikasi kustom Anda.