Buka konsol

Memverifikasi Token ID

Jika aplikasi klien Firebase Anda berkomunikasi dengan server backend khusus, Anda mungkin harus mengidentifikasi pengguna yang sedang login di server tersebut. Untuk melakukannya dengan aman, setelah berhasil login, kirim token ID pengguna ke server Anda melalui HTTPS. Kemudian, di server, verifikasi integritas dan keaslian token ID dan ambil uid dari sana. Anda dapat menggunakan uid yang dikirim dengan cara ini untuk mengidentifikasi pengguna yang sedang login di server Anda dengan aman.

Sebelum memulai

Untuk memverifikasi token ID dengan Firebase Admin SDK, Anda harus memiliki akun layanan. Ikuti petunjuk penyiapan Admin SDK untuk informasi lebih lanjut tentang cara menginisialisasi Admin SDK dengan akun layanan.

Mengambil token ID pada klien

Jika pengguna atau perangkat berhasil login, Firebase akan membuat token ID yang sesuai dan dapat mengidentifikasi pengguna atau perangkat tersebut secara unik dan memberikan akses ke beberapa resource, seperti Firebase Realtime Database dan Cloud Storage. Anda dapat menggunakan kembali token ID tersebut untuk mengidentifikasi pengguna atau perangkat pada server backend khusus Anda. Untuk mengambil token ID dari klien, pastikan pengguna sudah login, kemudian dapatkan token ID dari pengguna yang login:

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
          // ...
}];
Swift
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();
            }
        }
    });

Unity

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
});

Jika sudah memiliki token ID, Anda dapat mengirim JWT tersebut ke backend dan memvalidasinya dengan Firebase Admin SDK atau library JWT pihak ketiga jika server Anda ditulis dalam bahasa yang tidak didukung Firebase secara default.

Memverifikasi token ID menggunakan Firebase Admin SDK

Firebase Admin SDK memiliki metode bawaan untuk memverifikasi dan mendekodekan token ID. Jika token ID yang diberikan memiliki format yang benar, masa berlakunya belum habis, dan ditandatangani dengan benar, metode akan menampilkan token ID yang didekode. Anda bisa mendapatkan uid pengguna atau perangkat dari token yang didekode.

Ikuti petunjuk penyiapan Admin SDK untuk menginisialisasi Admin SDK dengan akun layanan. Kemudian, gunakan metode verifyIdToken() untuk memverifikasi token ID:

Node.js

// idToken comes from the client app
admin.auth().verifyIdToken(idToken)
  .then(function(decodedToken) {
    let uid = decodedToken.uid;
    // ...
  }).catch(function(error) {
    // Handle error
  });

Java

// 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']

Go

client, err := app.Auth(context.Background())
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 project ID. Firebase Admin SDK mencoba mendapatkan project ID 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 kolom project_id dari objek JSON akun layanan.
  • Jika variabel lingkungan GOOGLE_CLOUD_PROJECT disetel, SDK menggunakan nilainya sebagai project ID. Variabel lingkungan ini tersedia untuk kode yang berjalan di infrastruktur Google seperti Google App Engine dan Google Compute Engine.

Memverifikasi token ID menggunakan library JWT pihak ketiga

Jika backend Anda menggunakan bahasa yang tidak didukung Firebase Admin SDK, Anda masih dapat memverifikasi token ID. Pertama, temukan library JWT pihak ketiga untuk bahasa Anda. Kemudian, verifikasi header, payload, dan tanda tangan token ID.

Verifikasikan bahwa header token ID sesuai dengan batasan berikut:

Klaim Header Token ID
alg Algoritme "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

Verifikasikan bahwa payload token ID sesuai dengan batasan berikut:

Klaim Payload Token ID
exp Waktu habis masa berlaku Harus di masa depan. Waktu diukur dalam hitungan detik sejak epoch UNIX.
iat Waktu penerbitan Harus di masa lalu. Waktu diukur dalam hitungan detik sejak epoch UNIX.
aud Audience Harus berupa project ID Firebase Anda, pengenal unik untuk project Firebase Anda, yang dapat ditemukan di URL pada konsol project tersebut.
iss Penerbit Harus berupa "https://securetoken.google.com/<projectId>", di mana <projectId> merupakan project ID yang sama untuk aud di atas.
sub Subjek Harus berupa string yang tidak kosong dan harus berupa uid pengguna atau perangkat.
auth_time Waktu autentikasi Harus di masa lalu. Waktu ketika pengguna diautentikasi.

Terakhir, pastikan bahwa token ID telah ditandatangani oleh kunci pribadi yang sesuai dengan klaim kid token. Dapatkan kunci publik dari https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com dan gunakan library JWT untuk memverifikasi tanda tangan. Gunakan nilai max-age di header Cache-Control pada respons dari endpoint tersebut untuk mengetahui kapan harus memperbarui kunci publik.

Jika semua verifikasi di atas berhasil, Anda dapat menggunakan subjek (sub) dari token ID sebagai uid untuk pengguna atau perangkat yang sesuai.