Memproses login pengguna dengan SAML
Dokumen ini menunjukkan cara menggunakan Identity Platform untuk login pengguna dengan penyedia Security Assertion Markup Language (SAML) 2.0.
Sebelum memulai
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
- Aktifkan Identity Platform, dan tambahkan SDK klien ke aplikasi Anda. Untuk mengetahui informasi dan petunjuk selengkapnya, lihat panduan memulai Login pengguna dengan email menggunakan Identity Platform.
Di konsol Google Cloud , buka halaman Identity Platform > Penyedia identitas.
Buka Penyedia identitasKlik Tambahkan Penyedia, lalu pilih SAML dari daftar.
Masukkan detail berikut:
Nama penyedia. Nilai ini bisa sama dengan ID penyedia atau nama kustom. Jika Anda memasukkan nama kustom, klik Edit di samping ID Penyedia untuk menentukan ID (yang harus dimulai dengan
saml
).ID Entitas penyedia.
URL SSO SAML penyedia.
Sertifikat yang digunakan untuk penandatanganan token di penyedia. Pastikan untuk menyertakan string awal dan akhir. Contoh:
-----BEGIN CERTIFICATE----- MIICajCCAdOgAwIBAgIBADANBgkqhkiG9w0BAQ0FADBSMQswCQYDVQQGEwJ1czEL ... LEzc1JwEGQQVDYQCwsQMSBDAF0QAB0w9GikhqkgBNADABIgABIwAgOdACCjaCIIM -----END CERTIFICATE-----
Di bagian Penyedia layanan, masukkan ID Entitas aplikasi Anda. Biasanya, ID ini adalah URL aplikasi Anda. Di penyedia identitas SAML Anda, ini disebut sebagai audiens.
Di panel samping Project settings, klik Add Domain, lalu tambahkan domain aplikasi Anda. Misalnya, jika URL login aplikasi Anda adalah
https://example.com/login
, tambahkanexample.com
.Untuk menyelesaikan penyiapan, lakukan salah satu hal berikut:
Salin URL callback otorisasi default dari kolom Callback otorisasi (URL) dan tambahkan ke konfigurasi aplikasi SAML Anda.
Menggunakan URL callback otorisasi default akan mengurangi kompleksitas validasi respons SAML.
Tambahkan URL callback otorisasi yang disesuaikan ke konfigurasi aplikasi SAML Anda—misalnya,
https://PROJECT-ID.firebaseapp.com/__/auth/handler
.
Di bagian Konfigurasi aplikasi Anda, klik Detail Penyiapan. Salin cuplikan ke dalam kode aplikasi Anda untuk melakukan inisialisasi SDK klien Identity Platform.
Klik Simpan.
project-id
: ID untuk Google Cloud projectprovider-id
: ID penyedia SAMLBuat instance
SAMLAuthProvider
dengan ID penyedia yang Anda konfigurasi di bagian sebelumnya. ID penyedia harus diawali dengansaml
.Web versi 9
import { SAMLAuthProvider } from "firebase/auth"; const provider = new SAMLAuthProvider("saml.myProvider");
Web versi 8
const provider = new firebase.auth.SAMLAuthProvider('saml.myProvider');
Mulai alur login. Anda dapat memilih untuk menggunakan pop-up atau pengalihan.
Pop-up
Web versi 9
import { getAuth, signInWithPopup, SAMLAuthProvider } from "firebase/auth"; const auth = getAuth(); signInWithPopup(auth, provider) .then((result) => { // User is signed in. // Provider data available from the result.user.getIdToken() // or from result.user.providerData }).catch((error) => { // Handle Errors here. const errorCode = error.code; const errorMessage = error.message; // The email of the user's account used. const email = error.customData.email; // The AuthCredential type that was used. const credential = SAMLAuthProvider.credentialFromError(error); // Handle / display error. // ... });
Web versi 8
firebase.auth().signInWithPopup(provider) .then((result) => { // User is signed in. // Identity provider data available in result.additionalUserInfo.profile, // or from the user's ID token obtained from result.user.getIdToken() // as an object in the firebase.sign_in_attributes custom claim // This is also available from result.user.getIdTokenResult() // idTokenResult.claims.firebase.sign_in_attributes. }) .catch((error) => { // Handle / display error. // ... });
Pengalihan
Untuk mengalihkan ke halaman login, panggil
signInWithRedirect()
:Web versi 9
import { getAuth, signInWithRedirect } from "firebase/auth"; const auth = getAuth(); signInWithRedirect(auth, provider);
Web versi 8
firebase.auth().signInWithRedirect(provider);
Kemudian, panggil
getRedirectResult()
untuk mendapatkan hasilnya saat pengguna kembali ke aplikasi Anda:Web versi 9
import { getAuth, getRedirectResult, SAMLAuthProvider } from "firebase/auth"; const auth = getAuth(); getRedirectResult(auth) .then((result) => { // User is signed in. // Provider data available from the result.user.getIdToken() // or from result.user.providerData }) .catch((error) => { // Handle Errors here. const errorCode = error.code; const errorMessage = error.message; // The email of the user's account used. const email = error.customData.email; // The AuthCredential type that was used. const credential = SAMLAuthProvider.credentialFromError(error); // Handle / display error. // ... });
Web versi 8
firebase.auth().getRedirectResult() .then((result) => { // User is signed in. // Provider data available in result.additionalUserInfo.profile, // or from the user's ID token obtained from result.user.getIdToken() // as an object in the firebase.sign_in_attributes custom claim // This is also available from result.user.getIdTokenResult() // idTokenResult.claims.firebase.sign_in_attributes. }).catch((error) => { // Handle / display error. // ... });
Ambil atribut pengguna yang terkait dengan penyedia SAML dari token ID menggunakan klaim
firebase.sign_in_attributes
. Pastikan untuk memverifikasi token ID menggunakan Admin SDK saat Anda mengirimkannya ke server.Token ID menyertakan alamat email pengguna hanya jika diberikan dalam atribut
NameID
pernyataan SAML dari penyedia identitas:<Subject> <NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">test@email.com</NameID> </Subject>
Nilai ini diisi dalam token ID yang dikeluarkan Firebase dan dalam objek UserInfo.
- Memproses login pengguna dengan OIDC
- Menampilkan domain kustom selama login
- Mengelola penyedia OIDC dan SAML secara terprogram
Mengonfigurasi penyedia
Elemen wajib penyedia
Identity Platform mengharapkan elemen <saml:Subject>
dan <saml:NameID>
dalam respons dari penyedia.
Jika Anda tidak menentukan nilai untuk elemen ini saat mengonfigurasi penyedia, pernyataan SAML akan gagal.
Permintaan tanda tangan
Anda dapat meningkatkan keamanan permintaan autentikasi dengan menandatanganinya.
Untuk menandatangani permintaan, aktifkan terlebih dahulu permintaan bertanda tangan untuk penyedia identitas Anda dengan
memanggil inboundSamlConfigs.patch()
dan menyetel idp_config.sign_request
ke true
:
REST
Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:
Metode HTTP dan URL:
PATCH https://identitytoolkit.googleapis.com/admin/v2/projects/project-id/inboundSamlConfigs/provider-id?updateMask=idpConfig.signRequest
Meminta isi JSON:
{ "idp_config": { "sign_request": true } }
Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:
Anda harus menggunakan REST API untuk mengaktifkan permintaan bertanda tangan; penggunaan konsolGoogle Cloud atau Google Cloud CLI tidak didukung.
Responsnya adalah objek
InboundSamlConfig
, yang mencakup array SpCertificate
.
Konfigurasi nilai sertifikat X509 dengan penyedia identitas SAML Anda agar
dapat memvalidasi tanda tangan permintaan Anda.
Login pengguna
Saat Anda membuat pengguna login, Client SDK akan menangani handshake autentikasi, lalu menampilkan token ID yang berisi atribut SAML dalam payload-nya. Untuk memproses login pengguna dan mendapatkan atribut dari penyedia SAML:
Hanya alur SAML yang dimulai oleh penyedia layanan dari SDK klien yang didukung.
Menautkan akun pengguna
Jika pengguna telah login ke aplikasi Anda menggunakan metode lain (seperti email/sandi),
Anda dapat menautkan akun yang sudah ada ke
penyedia SAML menggunakan linkWithPopup()
atau linkWithRedirect()
.
Cuplikan kode berikut menunjukkan cara menautkan Akun Google pengguna ke penyedia SAML:
Web versi 9
import { getAuth, linkWithPopup, GoogleAuthProvider } from "firebase/auth"; const provider = new GoogleAuthProvider(); const auth = getAuth(); linkWithPopup(auth.currentUser, provider).then((result) => { // Accounts successfully linked. const credential = GoogleAuthProvider.credentialFromResult(result); const user = result.user; // ... }).catch((error) => { // Handle Errors here. // ... });
Web versi 8
auth.currentUser.linkWithPopup(provider).then((result) => { // Accounts successfully linked. var credential = result.credential; var user = result.user; // ... }).catch((error) => { // Handle Errors here. // ... });