Xác thực bằng SAML trong các ứng dụng web

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 dựa trên SAML mà bạn chọn. Nhờ đó, bạn có thể sử dụng giải pháp SSO dựa trên SAML để đăng nhập người dùng 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

Để đăng nhập người dùng bằng nhà cung cấp dịch vụ 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 dịch vụ danh tính:

  • Mã nhận dạng thực thể của nhà cung cấp dịch vụ danh tính: Một URI xác định nhà cung cấp dịch vụ danh tính.
  • URL SSO 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 dịch vụ danh tính: Chứng chỉ dùng để xác thực mã thông báo do nhà cung cấp dịch vụ danh tính ký.
  • 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 của bạn:

  1. Thêm Firebase vào dự án JavaScript.

  2. Nếu chưa nâng cấp lên Firebase Authentication with Identity Platform, hãy nâng cấp. Xác thực SAML chỉ có trong các dự án đã nâng cấp.

  3. Trên trang Nhà cung cấp dịch vụ đăng nhập của bảng điều khiển Firebase, hãy nhấp vào Thêm nhà cung cấp mới, rồi nhấp vào SAML.

  4. Đặt tên cho nhà cung cấp nà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.

  5. Chỉ định mã nhận dạng thực thể, URL 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 khớp chính xác với các giá trị mà nhà cung cấp đã chỉ định cho bạn.

  6. Lưu thay đổi.

  7. Nếu bạn chưa uỷ quyền cho miền của ứng dụng, hãy thêm miền đó vào danh sách cho phép trên trang Xác thực > Cài đặt của bảng điều khiển Firebase.

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:

  1. Tạo một phiên bản SAMLAuthProvider bằng mã nhận dạng nhà cung cấp mà bạn nhận được trong bảng điều khiển của Firebase.

    Web

    import { SAMLAuthProvider } from "firebase/auth";
    
    const provider = new SAMLAuthProvider('saml.example-provider');
    

    Web

    var provider = new firebase.auth.SAMLAuthProvider('saml.example-provider');
    ``
    
  1. 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 quy trình đăng nhập và quay lại ứng dụng của bạn, bạn có thể nhận được 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.
      });
    

    Luồng cửa sổ 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ỉ chứa địa chỉ email của người dùng nếu địa chỉ đó được cung cấp trong thuộc tính NameID của câu khẳng định SAML từ nhà cung cấp dịch vụ danh tính:

    <Subject>
      <NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">test@email.com</NameID>
    </Subject>
    
  2. Mặc dù các ví dụ 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 tại bằng cách sử dụng linkWithRedirect()linkWithPopup(), đồng thời xác thực lại người dùng bằng reauthenticateWithRedirect()reauthenticateWithPopup(). Bạn có thể dùng các mã này để truy xuất thông tin đăng nhập mới cho các hoạt động nhạy cảm đòi hỏi phải đăng nhập gần đây.