Memverifikasi Token ID

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

Sebelum memulai

Untuk memverifikasi token ID dengan Firebase Admin SDK, Anda harus memiliki akun layanan. Ikuti petunjuk penyiapan Admin SDK untuk informasi lebih lanjut 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 memberikannya 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 sudah login tersebut:

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.is_valid()) {
  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 mendekode token ID. Jika token ID yang diberikan memiliki format yang benar, masa berlakunya belum habis, dan ditandatangani dengan benar, metode tersebut akan menampilkan token ID yang didekode. Anda dapat mengambil 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
getAuth()
  .verifyIdToken(idToken)
  .then((decodedToken) => {
    const uid = decodedToken.uid;
    // ...
  })
  .catch((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(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 project ID. Firebase Admin SDK mencoba mendapatkan project ID melalui salah satu metode berikut:

  • Jika SDK diinisialisasi dengan opsi aplikasi projectId eksplisit, SDK akan menggunakan nilai opsi tersebut.
  • Jika SDK diinisialisasi dengan kredensial akun layanan, SDK akan menggunakan kolom project_id objek JSON akun layanan tersebut.
  • Jika variabel lingkungan GOOGLE_CLOUD_PROJECT ditetapkan, SDK menggunakan nilainya sebagai project ID. Variabel lingkungan ini tersedia untuk kode yang berjalan di infrastruktur Google seperti App Engine dan 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.

Verifikasi bahwa 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

Verifikasi 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, yaitu ID unik untuk project Firebase Anda yang dapat ditemukan di URL konsol project tersebut.
iss Penerbit Harus berupa "https://securetoken.google.com/<projectId>", dan <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 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 library JWT untuk memverifikasi tanda tangan. Gunakan nilai max-age dalam header Cache-Control respons dari endpoint tersebut guna mengetahui waktu untuk memperbarui kunci publik.

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