如果您已升級到使用 Identity Platform 進行 Firebase 身份驗證,則可以使用您選擇的 SAML 身份提供商通過 Firebase 對用戶進行身份驗證。這使得您可以使用基於 SAML 的 SSO 解決方案將用戶登錄到您的 Firebase 應用。
Firebase 身份驗證僅支持服務提供商發起的 SAML 流。
在你開始之前
要使用 SAML 身份提供商登錄用戶,您必須首先從提供商收集一些信息:
- 提供者的實體 ID :標識身份提供者的 URI。
- 提供商的 SAML SSO URL :身份提供商登錄頁面的 URL。
- 提供者的公鑰證書:用於驗證身份提供者簽名的令牌的證書。
- 您的應用程序的實體 ID :標識您的應用程序(“服務提供商”)的 URI。
獲得上述信息後,啟用 SAML 作為您的 Firebase 項目的登錄提供程序:
如果您尚未升級到帶有 Identity Platform 的 Firebase 身份驗證,請升級。 SAML 身份驗證僅在升級的項目中可用。
在 Firebase 控制台的登錄提供商頁面上,單擊添加新提供商,然後單擊SAML 。
為該提供者指定一個名稱。請注意生成的提供程序 ID:類似於
saml.example-provider
。當您向應用添加登錄代碼時,您將需要此 ID。指定您的身份提供商的實體 ID、SSO URL 和公鑰證書。還要指定您的應用程序(服務提供商)的實體 ID。這些值必須與您的提供商分配給您的值完全匹配。
保存您的更改。
如果您尚未授權應用的域,請將其添加到 Firebase 控制台的“身份驗證”>“設置”頁面上的允許列表中。
使用 Firebase SDK 處理登錄流程
要使用 Firebase JavaScript SDK 處理登錄流程,請按照以下步驟操作:
使用您在 Firebase 控制台中獲取的提供商 ID 創建
SAMLAuthProvider
的實例。網絡模塊化API
import { SAMLAuthProvider } from "firebase/auth"; const provider = new SAMLAuthProvider('saml.example-provider');
Web 命名空間 API
var provider = new firebase.auth.SAMLAuthProvider('saml.example-provider'); ``
使用 SAML 提供程序對象通過 Firebase 進行身份驗證。
您可以將用戶重定向到提供商的登錄頁面,也可以在彈出的瀏覽器窗口中打開登錄頁面。
重定向流程
通過調用
signInWithRedirect()
重定向到提供者登錄頁面:網絡模塊化API
import { getAuth, signInWithRedirect } from "firebase/auth"; const auth = getAuth(); signInWithRedirect(auth, provider);
Web 命名空間 API
firebase.auth().signInWithRedirect(provider);
用戶完成登錄並返回應用後,您可以通過調用
getRedirectResult()
獲取登錄結果。網絡模塊化API
import { getAuth, getRedirectResult, SAMLAuthProvider } from "firebase/auth"; const auth = getAuth(); getRedirectResult(auth) .then((result) => { // User is signed in. // Provider data available using getAdditionalUserInfo() }) .catch((error) => { // Handle error. });
Web 命名空間 API
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. }) .catch((error) => { // Handle error. });
彈出流程
網絡模塊化API
import { getAuth, signInWithPopup, OAuthProvider } from "firebase/auth"; const auth = getAuth(); signInWithPopup(auth, provider) .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. }) .catch((error) => { // Handle error. });
Web 命名空間 API
firebase.auth().signInWithPopup(provider) .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. }) .catch((error) => { // Handle error. });
僅當身份提供商的 SAML 斷言的
NameID
屬性中提供了用戶的電子郵件地址時,ID 令牌和UserInfo對象才包含用戶的電子郵件地址:<Subject> <NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">test@email.com</NameID> </Subject>
雖然上面的示例重點介紹登錄流程,但您可以使用相同的模式使用
linkWithRedirect()
和linkWithPopup()
將 SAML 提供程序鏈接到現有用戶,並使用reauthenticateWithRedirect()
和reauthenticateWithPopup()
重新驗證用戶身份,它可用於檢索需要最近登錄的敏感操作的新憑據。