Nếu đã nâng cấp lên Firebase Authentication with Identity Platform, bạn có thể xác thực người dùng bằng Firebase thông qua nhà cung cấp danh tính SAML mà bạn chọn. Nhờ đó, bạn có thể sử dụng giải pháp Đăng nhập một lần (SSO) dựa trên SAML để cho phép người dùng đăng nhập vào ứng dụng Firebase.
Firebase Authentication chỉ hỗ trợ quy trình SAML do nhà cung cấp dịch vụ khởi tạo.
Trước khi bắt đầu
Để cho phép người dùng đăng nhập bằng nhà cung cấp danh tính SAML, trước tiên, bạn phải thu thập một số thông tin từ nhà cung cấp:
- Mã nhận dạng thực thể của nhà cung cấp: Một URI xác định nhà cung cấp danh tính.
- URL Đăng nhập một lần (SSO) dựa trên SAML của nhà cung cấp: URL của trang đăng nhập của nhà cung cấp danh tính.
- Chứng chỉ khoá công khai của nhà cung cấp: Chứng chỉ dùng để xác thực mã thông báo được ký bởi nhà cung cấp danh tính.
- Mã nhận dạng thực thể của ứng dụng: Một URI xác định ứng dụng của bạn, "nhà cung cấp dịch vụ".
Sau khi có thông tin nêu trên, hãy bật SAML làm nhà cung cấp dịch vụ đăng nhập cho dự án Firebase:
Nếu chưa nâng cấp, hãy đảm bảo rằng dự án của bạn đã được nâng cấp lên Firebase Authentication with Identity Platform. Tính năng xác thực SAML chỉ có trong các dự án đã nâng cấp.
Trong bảng điều khiển Firebase, hãy chuyển đến phần Security > Authentication.
Trong thẻ Sign-in method (Phương thức đăng nhập), hãy nhấp vào Add new provider (Thêm nhà cung cấp mới), rồi nhấp vào SAML.
Đặt tên cho nhà cung cấp này. Hãy lưu ý mã nhận dạng nhà cung cấp được tạo: chẳng hạn như
saml.example-provider. Bạn sẽ cần mã nhận dạng này khi thêm mã đăng nhập vào ứng dụng.Chỉ định mã nhận dạng thực thể, URL Đăng nhập một lần (SSO) và chứng chỉ khoá công khai của nhà cung cấp danh tính. Đồng thời, hãy chỉ định mã nhận dạng thực thể của ứng dụng (nhà cung cấp dịch vụ). Các giá trị này phải hoàn toàn khớp với các giá trị mà nhà cung cấp đã chỉ định cho bạn.
Lưu thay đổi.
Nếu chưa, hãy cho phép miền của ứng dụng:
Trong bảng điều khiển Firebase, hãy chuyển đến thẻ Security > Authentication > Settings.
Trong phần Authorized domains (Miền được phép), hãy nhấp vào Add domain (Thêm miền) rồi thêm miền của bạn.
Xử lý quy trình đăng nhập bằng Firebase SDK
Để xử lý quy trình đăng nhập bằng SDK JavaScript của Firebase, hãy làm theo các bước sau:
Tạo một thực thể của
SAMLAuthProviderbằng mã nhận dạng nhà cung cấp mà bạn nhận được trong bảng điều khiển Firebase.Web
import { SAMLAuthProvider } from "firebase/auth"; const provider = new SAMLAuthProvider('saml.example-provider');Web
var provider = new firebase.auth.SAMLAuthProvider('saml.example-provider'); ``
Xác thực bằng Firebase thông qua đối tượng nhà cung cấp SAML.
Bạn có thể chuyển hướng người dùng đến trang đăng nhập của nhà cung cấp hoặc mở trang đăng nhập trong cửa sổ trình duyệt bật lên.
Quy trình chuyển hướng
Chuyển hướng đến trang đăng nhập của nhà cung cấp bằng cách gọi
signInWithRedirect():Web
import { getAuth, signInWithRedirect } from "firebase/auth"; const auth = getAuth(); signInWithRedirect(auth, provider);Web
firebase.auth().signInWithRedirect(provider);Sau khi người dùng hoàn tất quá trình đăng nhập và quay lại ứng dụng của bạn, bạn có thể lấy kết quả đăng nhập bằng cách gọi
getRedirectResult().Web
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
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. });Quy trình bật lên
Web
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
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. });Mã thông báo nhận dạng và đối tượng UserInfo chứa địa chỉ email của người dùng chỉ khi địa chỉ email đó được cung cấp trong thuộc tính
NameIDcủa câu khẳng định SAML từ nhà cung cấp danh tính:<Subject> <NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">test@email.com</NameID> </Subject>Mặc dù các ví dụ nêu trên tập trung vào quy trình đăng nhập, nhưng bạn có thể sử dụng cùng một mẫu để liên kết nhà cung cấp SAML với người dùng hiện có bằng cách sử dụng
linkWithRedirect()vàlinkWithPopup(), đồng thời xác thực lại người dùng bằngreauthenticateWithRedirect()vàreauthenticateWithPopup(). Bạn có thể dùng các phương thức này để truy xuất thông tin xác thực mới cho các thao tác nhạy cảm yêu cầu đăng nhập gần đây.