Jika telah mengupgrade ke Firebase Authentication with Identity Platform, Anda dapat mengautentikasi pengguna dengan Firebase menggunakan penyedia yang mendukung OpenID Connect (OIDC) pilihan Anda. Hal ini memungkinkan Anda menggunakan penyedia identitas yang tidak didukung secara native oleh Firebase.
Sebelum memulai
Untuk memproses login pengguna menggunakan penyedia OIDC, Anda harus terlebih dahulu mengumpulkan sejumlah informasi dari penyedia:
Client ID: String yang unik untuk penyedia yang mengidentifikasi aplikasi Anda. Penyedia dapat menetapkan client ID yang berbeda untuk setiap platform yang Anda dukung. Ini adalah salah satu nilai dari klaim
aud
dalam token ID yang dikeluarkan oleh penyedia.Rahasia klien: String rahasia yang digunakan penyedia untuk mengonfirmasi kepemilikan client ID. Untuk setiap client ID, Anda memerlukan rahasia klien yang cocok. (Nilai ini hanya diperlukan jika Anda menggunakan alur kode otorisasi, yang sangat direkomendasikan.)
Penerbit: String yang mengidentifikasi penyedia Anda. Nilai ini harus berupa URL yang, jika ditambahkan dengan
/.well-known/openid-configuration
, merupakan lokasi dokumen penemuan OIDC penyedia. Misalnya, jika penerbitnya adalahhttps://auth.example.com
, dokumen penemuan harus tersedia dihttps://auth.example.com/.well-known/openid-configuration
.
Setelah memiliki informasi di atas, aktifkan OpenID Connect sebagai penyedia login untuk project Firebase Anda:
Jika Anda belum mengupgrade ke Firebase Authentication with Identity Platform, lakukan hal tersebut terlebih dahulu. Autentikasi OpenID Connect hanya tersedia di project yang telah diupgrade.
Pada halaman Sign-in providers di Firebase console, klik Add new provider, lalu klik OpenID Connect.
Pilih apakah Anda akan menggunakan alur kode otorisasi atau alur pemberian implisit.
Anda harus selalu menggunakan alur kode jika penyedia mendukungnya. Alur implisit kurang aman dan sangat tidak dianjurkan.
Beri nama untuk penyedia ini. Catat ID penyedia yang dibuat: seperti
oidc.example-provider
. Anda akan memerlukan ID ini saat menambahkan kode login ke aplikasi.Tentukan client ID dan rahasia klien, serta string penerbit penyedia Anda. Nilai ini harus sama persis dengan nilai yang ditetapkan penyedia untuk Anda.
Simpan perubahan Anda.
Menangani alur login dengan Firebase SDK
Jika Anda mem-build aplikasi Android, cara termudah untuk mengautentikasi pengguna dengan Firebase menggunakan penyedia OIDC adalah dengan menangani seluruh alur login dengan Firebase Android SDK.
Untuk menangani alur login dengan Firebase Android SDK, ikuti langkah-langkah berikut:
Buat instance OAuthProvider menggunakan Builder-nya dengan ID penyedia
Kotlin+KTX
val providerBuilder = OAuthProvider.newBuilder("oidc.example-provider")
Java
OAuthProvider.Builder providerBuilder = OAuthProvider.newBuilder("oidc.example-provider");
Opsional: Tentukan parameter OAuth kustom tambahan yang ingin dikirim dengan permintaan OAuth.
Kotlin+KTX
// Target specific email with login hint. providerBuilder.addCustomParameter("login_hint", "user@example.com")
Java
// Target specific email with login hint. providerBuilder.addCustomParameter("login_hint", "user@example.com");
Tanyakan kepada penyedia OIDC Anda untuk mengetahui parameter yang didukungnya. Perlu diperhatikan bahwa Anda tidak dapat meneruskan parameter yang diperlukan Firebase dengan
setCustomParameters()
. Beberapa parameter tersebut antara lain client_id, response_type, redirect_uri, state, scope, dan response_mode.Opsional: Tentukan cakupan OAuth 2.0 tambahan di luar profil dasar yang ingin diminta dari penyedia autentikasi.
Kotlin+KTX
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. providerBuilder.scopes = listOf("mail.read", "calendars.read")
Java
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. List<String> scopes = new ArrayList<String>() { { add("mail.read"); add("calendars.read"); } }; providerBuilder.setScopes(scopes);
Tanyakan kepada penyedia OIDC Anda untuk mengetahui cakupan yang mereka gunakan.
Lakukan autentikasi dengan Firebase menggunakan objek penyedia OAuth. Perlu diperhatikan bahwa tidak seperti operasi FirebaseAuth lainnya, operasi ini akan mengendalikan UI Anda dengan memunculkan Tab Chrome Kustom. Oleh sebab itu, jangan merujuk ke Aktivitas di
OnSuccessListener
danOnFailureListener
yang ditambahkan karena kedua pemroses tersebut akan langsung dihapus ketika operasi memulai UI.Anda harus terlebih dahulu memeriksa apakah Anda sudah menerima respons atau belum. Proses login dengan metode ini menempatkan Aktivitas Anda di latar belakang, yang berarti aktivitas tersebut dapat diklaim kembali oleh sistem selama alur login. Untuk memastikan bahwa Anda tidak membuat pengguna mencoba lagi jika hal ini terjadi, Anda harus memeriksa apakah hasilnya sudah ada atau belum.
Untuk memeriksa apakah ada hasil yang tertunda, panggil
getPendingAuthResult
:Kotlin+KTX
val pendingResultTask = firebaseAuth.pendingAuthResult if (pendingResultTask != null) { // There's something already here! Finish the sign-in for your user. pendingResultTask .addOnSuccessListener { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } .addOnFailureListener { // Handle failure. } } else { // There's no pending result so you need to start the sign-in flow. // See below. }
Java
Task<AuthResult> pendingResultTask = firebaseAuth.getPendingAuthResult(); if (pendingResultTask != null) { // There's something already here! Finish the sign-in for your user. pendingResultTask .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } }); } else { // There's no pending result so you need to start the sign-in flow. // See below. }
Untuk memulai alur login, panggil
startActivityForSignInWithProvider
:Kotlin+KTX
firebaseAuth .startActivityForSignInWithProvider(activity, provider.build()) .addOnSuccessListener { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } .addOnFailureListener { // Handle failure. }
Java
firebaseAuth .startActivityForSignInWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
Meskipun contoh di atas berfokus pada alur login, Anda juga dapat menautkan penyedia OIDC kepada pengguna yang ada menggunakan
startActivityForLinkWithProvider
. Misalnya, Anda dapat menautkan beberapa penyedia kepada pengguna yang sama agar bisa login dengan salah satu penyedia tersebut.Kotlin+KTX
// The user is already signed-in. val firebaseUser = firebaseAuth.currentUser!! firebaseUser .startActivityForLinkWithProvider(activity, provider.build()) .addOnSuccessListener { // Provider credential is linked to the current user. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // authResult.getCredential().getAccessToken(). // The OAuth secret can be retrieved by calling: // authResult.getCredential().getSecret(). } .addOnFailureListener { // Handle failure. }
Java
// The user is already signed-in. FirebaseUser firebaseUser = firebaseAuth.getCurrentUser(); firebaseUser .startActivityForLinkWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // Provider credential is linked to the current user. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // authResult.getCredential().getAccessToken(). // The OAuth secret can be retrieved by calling: // authResult.getCredential().getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
Pola yang sama dapat digunakan dengan
startActivityForReauthenticateWithProvider
, yang dapat digunakan untuk mengambil kredensial baru untuk operasi sensitif yang memerlukan login terbaru.Kotlin+KTX
// The user is already signed-in. val firebaseUser = firebaseAuth.currentUser!! firebaseUser .startActivityForReauthenticateWithProvider(activity, provider.build()) .addOnSuccessListener { // User is re-authenticated with fresh tokens and // should be able to perform sensitive operations // like account deletion and email or password // update. } .addOnFailureListener { // Handle failure. }
Java
// The user is already signed-in. FirebaseUser firebaseUser = firebaseAuth.getCurrentUser(); firebaseUser .startActivityForReauthenticateWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is re-authenticated with fresh tokens and // should be able to perform sensitive operations // like account deletion and email or password // update. } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
Menangani alur login secara manual
Jika sudah menerapkan alur login OpenID Connect di aplikasi, Anda dapat langsung menggunakan token ID untuk melakukan autentikasi dengan Firebase:
Kotlin+KTX
val providerId = "oidc.example-provider" // As registered in Firebase console. val credential = oAuthCredential(providerId) { setIdToken(idToken) // ID token from OpenID Connect flow. } Firebase.auth .signInWithCredential(credential) .addOnSuccessListener { authResult -> // User is signed in. // IdP data available in: // authResult.additionalUserInfo.profile } .addOnFailureListener { e -> // Handle failure. }
Java
AuthCredential credential = OAuthProvider .newCredentialBuilder("oidc.example-provider") // As registered in Firebase console. .setIdToken(idToken) // ID token from OpenID Connect flow. .build(); FirebaseAuth.getInstance() .signInWithCredential(credential) .addOnSuccessListener(new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in: // authResult.getAdditionalUserInfo().getProfile() } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
Langkah berikutnya
Setelah pengguna login untuk pertama kalinya, akun pengguna baru akan dibuat dan ditautkan ke kredensial, yaitu nama pengguna dan sandi, nomor telepon, atau informasi penyedia autentikasi, yang digunakan pengguna tersebut untuk login. Akun baru ini disimpan sebagai bagian dari project Firebase Anda, dan dapat digunakan untuk mengidentifikasi pengguna di setiap aplikasi dalam project, terlepas dari cara pengguna login.
-
Di aplikasi, Anda bisa mendapatkan informasi profil dasar pengguna dari objek
FirebaseUser
. Baca bagian Mengelola Pengguna. Di Aturan Keamanan Firebase Realtime Database dan Cloud Storage, Anda bisa mendapatkan ID pengguna unik milik pengguna yang login dari variabel
auth
, dan menggunakannya untuk mengontrol data yang dapat diakses oleh pengguna.
Anda dapat mengizinkan pengguna untuk login ke aplikasi menggunakan beberapa penyedia autentikasi dengan menautkan kredensial penyedia autentikasi ke akun pengguna yang ada.
Untuk memproses logout pengguna, panggil signOut
:
Kotlin+KTX
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();