Anda dapat mengizinkan pengguna melakukan autentikasi dengan Firebase menggunakan penyedia OAuth, seperti Microsoft Azure Active Directory, dengan mengintegrasikan Login OAuth umum ke aplikasi Anda menggunakan Firebase SDK untuk menjalankan alur login end to end.
Sebelum memulai
Untuk memproses login pengguna menggunakan akun Microsoft (akun Azure Active Directory dan akun Microsoft pribadi), Anda harus terlebih dahulu mengaktifkan Microsoft sebagai penyedia login untuk project Firebase:
- Tambahkan Firebase ke project JavaScript.
- Di Firebase console, buka bagian Auth.
- Pada tab Sign-in method, aktifkan penyedia Microsoft.
- Tambahkan Client ID dan Client Secret dari konsol developer penyedia tersebut ke konfigurasi penyedia:
- Untuk mendaftarkan klien OAuth Microsoft, ikuti petunjuk di Quickstart: Register an app with the Azure Active Directory v2.0 endpoint. Perlu diperhatikan bahwa endpoint ini mendukung login menggunakan akun pribadi Microsoft dan akun Azure Active Directory. Pelajari lebih lanjut Azure Active Directory v2.0.
- Saat mendaftarkan aplikasi ke penyedia ini, pastikan untuk mendaftarkan domain
*.firebaseapp.com
untuk project Anda sebagai domain pengalihan untuk aplikasi Anda.
- Klik Save.
Menangani alur login dengan Firebase SDK
Jika Anda membangun aplikasi web, cara termudah untuk mengautentikasi pengguna dengan Firebase menggunakan akun Microsoft mereka adalah dengan menangani seluruh alur login dengan Firebase JavaScript SDK.
Untuk menangani alur login dengan Firebase JavaScript SDK, ikuti langkah-langkah berikut:
Buat instance OAuthProvider menggunakan ID penyedia microsoft.com.
import { OAuthProvider } from "firebase/auth"; const provider = new OAuthProvider('microsoft.com');
var provider = new firebase.auth.OAuthProvider('microsoft.com');
Opsional: Tentukan parameter OAuth kustom tambahan yang ingin dikirim dengan permintaan OAuth.
provider.setCustomParameters({ // Force re-consent. prompt: 'consent', // Target specific email with login hint. login_hint: 'user@firstadd.onmicrosoft.com' });
provider.setCustomParameters({ // Force re-consent. prompt: 'consent', // Target specific email with login hint. login_hint: 'user@firstadd.onmicrosoft.com' });
Untuk mengetahui parameter yang didukung Microsoft, baca dokumentasi OAuth Microsoft. 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.Untuk mengizinkan hanya pengguna dari tenant Azure AD tertentu login ke aplikasi, nama domain sederhana tenant Azure AD atau ID GUID tenant dapat digunakan. Hal ini dapat dilakukan dengan menentukan kolom "tenant" di objek parameter kustom.
provider.setCustomParameters({ // Optional "tenant" parameter in case you are using an Azure AD tenant. // eg. '8eaef023-2b34-4da1-9baa-8bc8c9d6a490' or 'contoso.onmicrosoft.com' // or "common" for tenant-independent tokens. // The default value is "common". tenant: 'TENANT_ID' });
provider.setCustomParameters({ // Optional "tenant" parameter in case you are using an Azure AD tenant. // eg. '8eaef023-2b34-4da1-9baa-8bc8c9d6a490' or 'contoso.onmicrosoft.com' // or "common" for tenant-independent tokens. // The default value is "common". tenant: 'TENANT_ID' });
Opsional: Tentukan cakupan OAuth 2.0 tambahan selain profil dasar yang ingin diminta dari penyedia autentikasi.
provider.addScope('mail.read'); provider.addScope('calendars.read');
Untuk mempelajari lebih lanjut, baca dokumentasi izin dan persetujuan Microsoft.
Lakukan autentikasi dengan Firebase menggunakan objek penyedia OAuth. Anda dapat meminta pengguna untuk login dengan Akun Microsoft, baik dengan menampilkan jendela pop-up maupun dengan mengalihkannya ke halaman login. Untuk perangkat seluler, sebaiknya gunakan metode pengalihan.
- Untuk login dengan jendela pop-up, panggil
signInWithPopup
:
import { getAuth, signInWithPopup, OAuthProvider } from "firebase/auth"; const auth = getAuth(); signInWithPopup(auth, provider) .then((result) => { // User is signed in. // IdP data available in result.additionalUserInfo.profile. // Get the OAuth access token and ID Token const credential = OAuthProvider.credentialFromResult(result); const accessToken = credential.accessToken; const idToken = credential.idToken; }) .catch((error) => { // Handle error. });
firebase.auth().signInWithPopup(provider) .then((result) => { // IdP data available in result.additionalUserInfo.profile. // ... /** @type {firebase.auth.OAuthCredential} */ var credential = result.credential; // OAuth access and id tokens can also be retrieved: var accessToken = credential.accessToken; var idToken = credential.idToken; }) .catch((error) => { // Handle error. });
- Untuk login dengan beralih ke halaman login, panggil
signInWithRedirect
:
Ikuti praktik terbaik saat menggunakan
signInWithRedirect
,linkWithRedirect
, ataureauthenticateWithRedirect
.import { getAuth, signInWithRedirect } from "firebase/auth"; const auth = getAuth(); signInWithRedirect(auth, provider);
firebase.auth().signInWithRedirect(provider);
Setelah pengguna menyelesaikan proses login dan kembali ke halaman, Anda dapat mengambil hasil login dengan memanggil
getRedirectResult
.import { getAuth, getRedirectResult, OAuthProvider } from "firebase/auth"; const auth = getAuth(); getRedirectResult(auth) .then((result) => { // User is signed in. // IdP data available in result.additionalUserInfo.profile. // Get the OAuth access token and ID Token const credential = OAuthProvider.credentialFromResult(result); const accessToken = credential.accessToken; const idToken = credential.idToken; }) .catch((error) => { // Handle error. });
firebase.auth().getRedirectResult() .then((result) => { // IdP data available in result.additionalUserInfo.profile. // ... /** @type {firebase.auth.OAuthCredential} */ var credential = result.credential; // OAuth access and id tokens can also be retrieved: var accessToken = credential.accessToken; var idToken = credential.idToken; }) .catch((error) => { // Handle error. });
Setelah berhasil diselesaikan, token akses OAuth yang terkait dengan penyedia dapat diambil dari objek
firebase.auth.UserCredential
yang ditampilkan.Dengan token akses OAuth, Anda dapat memanggil Microsoft Graph API.
Misalnya, untuk mendapatkan informasi profil dasar, REST API berikut dapat dipanggil:
curl -i -H "Authorization: Bearer ACCESS_TOKEN" https://graph.microsoft.com/v1.0/me
Tidak seperti penyedia lain yang didukung oleh Firebase Auth, Microsoft tidak menyediakan URL foto. Sebagai gantinya, data biner untuk foto profil harus diminta melalui Microsoft Graph API.
Selain token akses OAuth, token ID OAuth pengguna juga dapat diambil dari objek
firebase.auth.UserCredential
. Klaimsub
dalam token ID adalah khusus aplikasi dan tidak akan cocok dengan ID pengguna gabungan yang digunakan oleh Firebase Auth dan dapat diakses melaluiuser.providerData[0].uid
. Sebagai gantinya, kolom klaimoid
harus digunakan. Saat menggunakan tenant Azure AD untuk login, klaimoid
akan berupa pencocokan persis. Namun, untuk kasus non-tenant, kolomoid
akan diberi padding. Untuk ID gabungan4b2eabcdefghijkl
,oid
akan memiliki format00000000-0000-0000-4b2e-abcdefghijkl
.- Untuk login dengan jendela pop-up, panggil
Meskipun contoh di atas berfokus pada alur login, Anda juga dapat menautkan penyedia Microsoft ke pengguna yang ada menggunakan
linkWithPopup
/linkWithRedirect
. Misalnya, Anda dapat menautkan beberapa penyedia ke pengguna yang sama agar pengguna dapat login dengan salah satu penyedia tersebut.import { getAuth, linkWithPopup, OAuthProvider } from "firebase/auth"; const provider = new OAuthProvider('microsoft.com'); const auth = getAuth(); linkWithPopup(auth.currentUser, provider) .then((result) => { // Microsoft credential is linked to the current user. // IdP data available in result.additionalUserInfo.profile. // Get the OAuth access token and ID Token const credential = OAuthProvider.credentialFromResult(result); const accessToken = credential.accessToken; const idToken = credential.idToken; }) .catch((error) => { // Handle error. });
var provider = new firebase.auth.OAuthProvider('microsoft.com'); firebase.auth().currentUser.linkWithPopup(provider) .then((result) => { // Microsoft credential is linked to the current user. // IdP data available in result.additionalUserInfo.profile. // OAuth access token can also be retrieved: // result.credential.accessToken // OAuth ID token can also be retrieved: // result.credential.idToken }) .catch((error) => { // Handle error. });
Pola yang sama dapat digunakan dengan
reauthenticateWithPopup
/reauthenticateWithRedirect
, yang dapat digunakan untuk mengambil kredensial baru untuk operasi sensitif yang memerlukan login terbaru.import { getAuth, reauthenticateWithPopup, OAuthProvider } from "firebase/auth"; const provider = new OAuthProvider('microsoft.com'); const auth = getAuth(); reauthenticateWithPopup(auth.currentUser, provider) .then((result) => { // User is re-authenticated with fresh tokens minted and // should be able to perform sensitive operations like account // deletion and email or password update. // IdP data available in result.additionalUserInfo.profile. // Get the OAuth access token and ID Token const credential = OAuthProvider.credentialFromResult(result); const accessToken = credential.accessToken; const idToken = credential.idToken; }) .catch((error) => { // Handle error. });
var provider = new firebase.auth.OAuthProvider('microsoft.com'); firebase.auth().currentUser.reauthenticateWithPopup(provider) .then((result) => { // User is re-authenticated with fresh tokens minted and // should be able to perform sensitive operations like account // deletion and email or password update. // IdP data available in result.additionalUserInfo.profile. // OAuth access token can also be retrieved: // result.credential.accessToken // OAuth ID token can also be retrieved: // result.credential.idToken }) .catch((error) => { // Handle error. });
Menangani Error account-exists-with-different-credential
Jika Anda mengaktifkan setelan One account per email address di Firebase console, saat pengguna mencoba login ke penyedia (seperti Facebook) dengan email yang sudah ada untuk penyedia pengguna Firebase lain (seperti Google), error auth/account-exists-with-different-credential
akan dilemparkan beserta objek AuthCredential
(token akses Facebook). Untuk menyelesaikan proses login ke penyedia yang dimaksud, pengguna harus login terlebih dahulu ke penyedia yang ada (Google) lalu menautkan akunnya ke AuthCredential
sebelumnya (kredensial Microsoft).
Mode pop-up
Jika menggunakan signInWithPopup
, Anda dapat menangani error auth/account-exists-with-different-credential
dengan kode seperti pada contoh berikut:
import { getAuth, linkWithCredential, signInWithPopup, OAuthProvider, } from "firebase/auth"; try { // Step 1: User tries to sign in using Microsoft. let result = await signInWithPopup(getAuth(), new OAuthProvider()); } catch (error) { // Step 2: User's email already exists. if (error.code === "auth/account-exists-with-different-credential") { // The pending Microsoft credential. let pendingCred = error.credential; // Step 3: Save the pending credential in temporary storage, // Step 4: Let the user know that they already have an account // but with a different provider, and let them choose another // sign-in method. } } // ... try { // Step 5: Sign the user in using their chosen method. let result = await signInWithPopup(getAuth(), userSelectedProvider); // Step 6: Link to the Microsoft credential. // TODO: implement `retrievePendingCred` for your app. let pendingCred = retrievePendingCred(); if (pendingCred !== null) { // As you have access to the pending credential, you can directly call the // link method. let user = await linkWithCredential(result.user, pendingCred); } // Step 7: Continue to app. } catch (error) { // ... }
Mode pengalihan
Error ini ditangani dengan cara yang mirip di mode pengalihan, tetapi perbedaannya, kredensial yang tertunda harus dimasukkan ke cache di antara pengalihan halaman (misalnya, menggunakan penyimpanan sesi).
Lanjutan: Menangani alur login secara manual
Tidak seperti penyedia OAuth lain yang didukung oleh Firebase, seperti Google, Facebook, dan Twitter, yang proses loginnya dapat langsung dilakukan dengan kredensial berbasis token akses OAuth, Firebase Auth tidak mendukung kemampuan yang sama untuk penyedia seperti Microsoft karena server Firebase Auth tidak dapat memverifikasi audience token akses OAuth Microsoft. Ini adalah persyaratan keamanan yang penting karena dapat membuat situs dan aplikasi rentan terkena serangan replay, yaitu ketika token akses OAuth Microsoft yang diperoleh untuk satu project (penyerang) dapat digunakan untuk login ke project lain (korban). Sebagai gantinya, Firebase Auth menyediakan kemampuan untuk menangani seluruh alur OAuth dan pertukaran kode otorisasi menggunakan client ID dan secret klien OAuth yang dikonfigurasi dalam Firebase Console. Karena kode otorisasi hanya dapat digunakan bersama dengan client ID atau secret klien tertentu, kode otorisasi yang diperoleh untuk satu project tidak dapat digunakan dengan project lain.
Jika penyedia ini harus digunakan di lingkungan yang tidak didukung, library OAuth pihak ketiga dan autentikasi kustom Firebase perlu digunakan. Library OAuth pihak ketiga diperlukan untuk mengautentikasi penyedia, sedangkan autentikasi kustom Firebase diperlukan untuk menukar kredensial penyedia dengan token kustom.
Melakukan autentikasi dengan Firebase di ekstensi Chrome
Jika Anda membangun aplikasi ekstensi Chrome, baca artikel Panduan Dokumen di Luar Layar.
Menyesuaikan domain pengalihan untuk login dengan Microsoft
Saat pembuatan project, Firebase akan menyediakan subdomain unik untuk project Anda:
https://my-app-12345.firebaseapp.com
.
Domain ini juga akan digunakan sebagai mekanisme pengalihan untuk login dengan OAuth. Domain tersebut harus diizinkan untuk semua penyedia OAuth yang didukung. Namun, hal ini berarti pengguna mungkin akan melihat domain tersebut saat login ke Microsoft sebelum dialihkan kembali ke aplikasi: Continue to: https://my-app-12345.firebaseapp.com.
Agar subdomain tidak ditampilkan, Anda dapat menyiapkan domain kustom dengan Firebase Hosting:
- Ikuti langkah 1 sampai 3 seperti yang tertera di artikel Menyiapkan domain Anda untuk Hosting. Saat Anda memverifikasi kepemilikan domain, Hosting akan menyediakan sertifikat SSL untuk domain kustom Anda.
- Tambahkan domain kustom ke daftar domain yang diizinkan di
Firebase console:
auth.custom.domain.com
. - Pada konsol developer Microsoft atau halaman penyiapan OAuth, berikan izin pada URL halaman pengalihan, yang akan dapat diakses di domain kustom Anda:
https://auth.custom.domain.com/__/auth/handler
. - Saat menginisialisasi library JavaScript, tentukan domain kustom Anda dengan kolom
authDomain
:var config = { apiKey: '...', // Changed from '
PROJECT_ID .firebaseapp.com'. authDomain: 'auth.custom.domain.com', databaseURL: 'https://PROJECT_ID .firebaseio.com', projectId: 'PROJECT_ID ', storageBucket: ' ', messagingSenderId: 'PROJECT_ID .firebasestorage.appSENDER_ID ' }; firebase.initializeApp(config);
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, cara yang direkomendasikan untuk mengetahui status autentikasi pengguna adalah dengan menetapkan observer pada objek
Auth
. Selanjutnya, Anda bisa mendapatkan informasi profil dasar pengguna dari objekUser
. 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
:
import { getAuth, signOut } from "firebase/auth"; const auth = getAuth(); signOut(auth).then(() => { // Sign-out successful. }).catch((error) => { // An error happened. });
firebase.auth().signOut().then(() => { // Sign-out successful. }).catch((error) => { // An error happened. });