Jika aplikasi klien Firebase Anda berkomunikasi dengan server backend kustom, Anda mungkin perlu mengidentifikasi pengguna yang saat ini masuk ke server tersebut. Untuk melakukannya dengan aman, setelah berhasil masuk, kirim token ID pengguna ke server Anda menggunakan HTTPS. Kemudian, di server, verifikasi integritas dan keaslian token ID dan ambil uid
darinya. Anda dapat menggunakan uid
yang dikirimkan dengan cara ini untuk mengidentifikasi pengguna yang saat ini masuk di server Anda dengan aman.
Sebelum kamu memulai
Untuk memverifikasi token ID dengan Firebase Admin SDK, Anda harus memiliki akun layanan. Ikuti petunjuk penyiapan Admin SDK untuk informasi selengkapnya tentang cara menginisialisasi Admin SDK dengan akun layanan.
Ambil token ID pada klien
Saat pengguna atau perangkat berhasil masuk, Firebase membuat token ID terkait yang mengidentifikasi mereka secara unik dan memberi mereka akses ke beberapa sumber daya, seperti Firebase Realtime Database dan Cloud Storage. Anda dapat menggunakan kembali token ID tersebut untuk mengidentifikasi pengguna atau perangkat di server backend kustom Anda. Untuk mengambil token ID dari klien, pastikan pengguna masuk, lalu dapatkan token ID dari pengguna yang masuk:
iOS+
Objective-C
FIRUser *currentUser = [FIRAuth auth].currentUser;
[currentUser getIDTokenForcingRefresh:YES
completion:^(NSString *_Nullable idToken,
NSError *_Nullable error) {
if (error) {
// Handle error
return;
}
// Send token to your backend via HTTPS
// ...
}];
Cepat
let currentUser = FIRAuth.auth()?.currentUser
currentUser?.getIDTokenForcingRefresh(true) { idToken, error in
if let error = error {
// Handle error
return;
}
// Send token to your backend via HTTPS
// ...
}
Android
FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
mUser.getIdToken(true)
.addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
public void onComplete(@NonNull Task<GetTokenResult> task) {
if (task.isSuccessful()) {
String idToken = task.getResult().getToken();
// Send token to your backend via HTTPS
// ...
} else {
// Handle error -> task.getException();
}
}
});
Persatuan
Firebase.Auth.FirebaseUser user = auth.CurrentUser;
user.TokenAsync(true).ContinueWith(task => {
if (task.IsCanceled) {
Debug.LogError("TokenAsync was canceled.");
return;
}
if (task.IsFaulted) {
Debug.LogError("TokenAsync encountered an error: " + task.Exception);
return;
}
string idToken = task.Result;
// Send token to your backend via HTTPS
// ...
});
C++
firebase::auth::User* user = auth->current_user();
if (user != nullptr) {
firebase::Future<std::string> idToken = user->GetToken(true);
// Send token to your backend via HTTPS
// ...
}
Web
firebase.auth().currentUser.getIdToken(/* forceRefresh */ true).then(function(idToken) {
// Send token to your backend via HTTPS
// ...
}).catch(function(error) {
// Handle error
});
Setelah memiliki token ID, Anda dapat mengirim JWT tersebut ke backend dan memvalidasinya menggunakan Firebase Admin SDK, atau menggunakan library JWT pihak ketiga jika server Anda ditulis dalam bahasa yang tidak didukung oleh Firebase.
Verifikasi token ID menggunakan Firebase Admin SDK
Firebase Admin SDK memiliki metode bawaan untuk memverifikasi dan mendekode token ID. Jika token ID yang diberikan memiliki format yang benar, tidak kedaluwarsa, dan ditandatangani dengan benar, metode akan mengembalikan token ID yang didekodekan. Anda dapat mengambil uid
pengguna atau perangkat dari token yang didekodekan.
Ikuti petunjuk penyiapan Admin SDK untuk menginisialisasi Admin SDK dengan akun layanan. Kemudian, gunakan metode verifikasiIdToken verifyIdToken()
untuk memverifikasi token ID:
Node.js
// idToken comes from the client app
getAuth()
.verifyIdToken(idToken)
.then((decodedToken) => {
const uid = decodedToken.uid;
// ...
})
.catch((error) => {
// Handle error
});
Jawa
// idToken comes from the client app (shown above)
FirebaseToken decodedToken = FirebaseAuth.getInstance().verifyIdToken(idToken);
String uid = decodedToken.getUid();
Python
# id_token comes from the client app (shown above)
decoded_token = auth.verify_id_token(id_token)
uid = decoded_token['uid']
Pergi
client, err := app.Auth(ctx)
if err != nil {
log.Fatalf("error getting Auth client: %v\n", err)
}
token, err := client.VerifyIDToken(ctx, idToken)
if err != nil {
log.Fatalf("error verifying ID token: %v\n", err)
}
log.Printf("Verified ID token: %v\n", token)
C#
FirebaseToken decodedToken = await FirebaseAuth.DefaultInstance
.VerifyIdTokenAsync(idToken);
string uid = decodedToken.Uid;
Verifikasi token ID memerlukan ID proyek. Firebase Admin SDK mencoba mendapatkan ID proyek melalui salah satu metode berikut:
- Jika SDK diinisialisasi dengan opsi aplikasi
projectId
eksplisit, SDK menggunakan nilai opsi tersebut. - Jika SDK diinisialisasi dengan kredensial akun layanan, SDK menggunakan bidang
project_id
dari objek JSON akun layanan. - Jika variabel lingkungan
GOOGLE_CLOUD_PROJECT
disetel, SDK menggunakan nilainya sebagai ID proyek. Variabel lingkungan ini tersedia untuk kode yang berjalan di infrastruktur Google seperti App Engine dan Compute Engine.
Verifikasi token ID menggunakan perpustakaan JWT pihak ketiga
Jika backend Anda menggunakan bahasa yang tidak didukung oleh Firebase Admin SDK, Anda masih dapat memverifikasi token ID. Pertama, temukan perpustakaan JWT pihak ketiga untuk bahasa Anda . Kemudian, verifikasi header, payload, dan tanda tangan token ID.
Pastikan header token ID sesuai dengan batasan berikut:
Klaim Header Token ID | ||
---|---|---|
alg | algoritma | "RS256" |
kid | ID kunci | Harus sesuai dengan salah satu kunci publik yang tercantum di https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com |
Pastikan payload token ID sesuai dengan batasan berikut:
Klaim Payload Token ID | ||
---|---|---|
exp | waktu kedaluwarsa | Harus di masa depan. Waktu diukur dalam detik sejak zaman UNIX. |
iat | Diterbitkan-pada waktu | Harus di masa lalu. Waktu diukur dalam detik sejak zaman UNIX. |
aud | Hadirin | Harus berupa ID proyek Firebase Anda, pengidentifikasi unik untuk proyek Firebase Anda, yang dapat ditemukan di URL konsol proyek tersebut. |
iss | Penerbit | Harus berupa "https://securetoken.google.com/<projectId>" , dengan <projectId> adalah ID proyek yang sama yang digunakan untuk aud di atas. |
sub | Subjek | Harus berupa string yang tidak kosong dan harus berupa uid pengguna atau perangkat. |
auth_time | Waktu otentikasi | Harus di masa lalu. Waktu ketika pengguna mengautentikasi. |
Terakhir, pastikan token ID ditandatangani oleh kunci pribadi yang sesuai dengan klaim kid
token. Ambil kunci publik dari https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com
dan gunakan perpustakaan JWT untuk memverifikasi tanda tangan. Gunakan nilai max-age
di header Cache-Control
dari respons dari titik akhir itu untuk mengetahui kapan harus me-refresh kunci publik.
Jika semua verifikasi di atas berhasil, Anda dapat menggunakan subjek ( sub
) token ID sebagai uid
dari pengguna atau perangkat yang sesuai.