Triển khai giải pháp nhận dạng bằng FedCM ở phía Bên phụ thuộc

Bên phụ thuộc (RP) cần hoàn tất các bước sau để bật FedCM trên trang web của họ:

Gọi API FedCM trên Bên tin cậy

Sau khi có cấu hình và các điểm cuối của IdP, RP có thể gọi navigator.credentials.get() để yêu cầu cho phép người dùng đăng nhập vào RP bằng IdP.

Trước khi gọi API, bạn cần xác nhận rằng FedCM có trên trình duyệt của người dùng. Để kiểm tra xem FedCM có dùng được hay không, hãy bao bọc mã này xung quanh quá trình triển khai FedCM của bạn:

  if ('IdentityCredential' in window) {
    // If the feature is available, take action
  } else {
    // FedCM is not supported, use a different identity solution
  }

Để cho phép người dùng đăng nhập vào IdP trên RP bằng FedCM, RP có thể gọi navigator.credentials.get(). Kể từ Chrome 136, RP có thể hỗ trợ nhiều IdP bằng cách chỉ định một mảng gồm nhiều nhà cung cấp danh tính trong một lệnh gọi navigator.credentials.get() duy nhất, ví dụ:

  const credential = await navigator.credentials.get({
      identity: {
        // Specify the IdP (or multiple IdPs, supported from Chrome 136) this Relying Party supports
        providers: [
        {
              configURL: 'https://accounts.idp-1.example/config.json',
              clientId: '********'
        },
        {
          configURL: 'https://accounts.idp-2.example/config.json',
          clientId: '********'
        }]
      }
    },
  );
  const { token } = credential;
  
  // Get the current IdP's configURL to identify which provider the user is signed in with
  const currentIdpConfigUrl = credential.configURL;
  if (currentIdpConfigUrl === 'https://idp1.example/foo.json') {
    // handle the case where the user signed in with idp1
  } else if (currentIdpConfigUrl === 'https://idp2.example/bar.json') {
    // handle the case where the user signed in with idp2
    }

Hãy dùng thử tính năng nhiều IdP bằng cách đăng nhập bằng IdP1IdP2.

Thuộc tính ngữ cảnh

Với thuộc tính context không bắt buộc, RP có thể sửa đổi chuỗi trong giao diện người dùng hộp thoại FedCM (ví dụ: "Đăng nhập vào rp.example…", "Sử dụng idp.example…") để đáp ứng các ngữ cảnh xác thực được xác định trước, chẳng hạn như. Thuộc tính context có thể có các giá trị sau:

  • signin (mặc định)
  • signup
  • use
Sơ đồ giải thích các thành phần giao diện người dùng của hộp thoại FedCM: ở phía trên cùng bên trái, một biểu tượng sẽ xuất hiện. Ở bên phải biểu tượng là một thành phần theo bối cảnh hiển thị thông báo "Đăng nhập vào RP bằng IdP". Ở dưới cùng là nút "Tiếp tục" có văn bản và màu nền tuỳ chỉnh.
Cách áp dụng thương hiệu cho hộp thoại FedCM

Ví dụ: việc đặt context thành use sẽ dẫn đến thông báo sau:

Một hộp thoại FedCM hiển thị thông báo ngữ cảnh tuỳ chỉnh: thay vì "Đăng nhập" bằng FedCM, thông báo ngữ cảnh sẽ là "Sử dụng" FedCM.
Hộp thoại FedCM hiển thị thông báo ngữ cảnh tuỳ chỉnh.

Trình duyệt xử lý các trường hợp sử dụng đăng ký và đăng nhập theo cách khác nhau, tuỳ thuộc vào sự tồn tại của approved_clients trong phản hồi từ điểm cuối danh sách tài khoản. Trình duyệt sẽ không hiển thị văn bản công bố "Để tiếp tục với ...." nếu người dùng đã đăng ký với RP.
Thuộc tính providers nhận một mảng gồm các đối tượng IdentityProvider có các thuộc tính sau:

Thuộc tính Providers

Thuộc tính providers nhận một mảng các đối tượng IdentityProvider có các thuộc tính sau:

Thuộc tính Mô tả
configURL (bắt buộc) Đường dẫn đầy đủ của tệp cấu hình IdP.
clientId (bắt buộc) Giá trị nhận dạng ứng dụng của RP, do IdP phát hành.
loginHint (không bắt buộc) Bằng cách chỉ định một trong các giá trị login_hints do các điểm cuối tài khoản cung cấp, hộp thoại FedCM sẽ chọn lọc hiển thị tài khoản được chỉ định.
domainHint (không bắt buộc) Bằng cách chỉ định một trong các giá trị domain_hints do các điểm cuối tài khoản cung cấp, hộp thoại FedCM sẽ chọn lọc hiển thị tài khoản được chỉ định.
mode (không bắt buộc) Chuỗi chỉ định chế độ giao diện người dùng của FedCM. Thuộc tính này có thể có một trong các giá trị sau:
  • "active": Người dùng phải tương tác để bắt đầu lời nhắc FedCM (chẳng hạn như nhấp vào một nút).
  • "passive": Lời nhắc FedCM sẽ được bắt đầu mà không cần người dùng tương tác trực tiếp.
Hãy xem trang tổng quan để tìm hiểu thêm về sự khác biệt giữa chế độ chủ động và chế độ thụ động.

Lưu ý: Thông số mode được hỗ trợ từ Chrome 132.
fields (không bắt buộc) Mảng gồm các chuỗi chỉ định thông tin người dùng mà RP cần IdP chia sẻ với họ. Bạn có thể chỉ định các trường sau đây (không bắt buộc):
  • "name"
  • "username"
  • "email"
  • "tel"
  • "picture"
Lưu ý: Chrome 132 trở lên có hỗ trợ Fields API. Các trường "username""tel" được hỗ trợ từ Chrome 141.
params (không bắt buộc) Đối tượng tuỳ chỉnh cho phép chỉ định các tham số khoá-giá trị bổ sung:
  • scope: Giá trị chuỗi chứa các quyền bổ sung mà RP cần yêu cầu, ví dụ: "drive.readonly calendar.readonly"
  • nonce: Một chuỗi ngẫu nhiên để đảm bảo phản hồi được đưa ra cho yêu cầu cụ thể này. Ngăn chặn các cuộc tấn công phát lại.
  • Các thông số khoá-giá trị tuỳ chỉnh khác.

Lưu ý: params được hỗ trợ từ Chrome 132.

Chế độ đang hoạt động

FedCM hỗ trợ các cấu hình chế độ trải nghiệm người dùng khác nhau. Chế độ thụ động là chế độ mặc định và nhà phát triển không cần định cấu hình chế độ này.

Cách sử dụng FedCM ở chế độ đang hoạt động:

  1. Kiểm tra phạm vi cung cấp của tính năng trong trình duyệt của người dùng.
  2. Gọi API bằng một cử chỉ nhất thời của người dùng, chẳng hạn như một lượt nhấp vào nút.
  3. Truyền tham số mode vào lệnh gọi API:
  let supportsFedCmMode = false;
  try {
    navigator.credentials.get({
      identity: Object.defineProperty(
        // Check if this Chrome version supports the Mode API.
        {}, 'mode', {
          get: function () { supportsFedCmMode = true; }
        }
      )
    });
  } catch(e) {}

  if (supportsFedCmMode) {
    // The button mode is supported. Call the API with mode property:
    return await navigator.credentials.get({
      identity: {
        providers: [{
          configURL: 'https://idp.example/config.json',
          clientId: '123',
        }],
        // The 'mode' value defines the UX mode of FedCM.
        // - 'active': Must be initiated by user interaction (e.g., clicking a button).
        // - 'passive': Can be initiated without direct user interaction.
        mode: 'active'
      }
    });
  }

Hãy dùng thử chế độ đang hoạt động với bản minh hoạ này.

Biểu tượng tuỳ chỉnh ở chế độ đang hoạt động

Chế độ đang hoạt động cho phép IdP đưa biểu tượng logo chính thức của RP trực tiếp vào phản hồi điểm cuối siêu dữ liệu của ứng dụng khách. RP phải cung cấp dữ liệu về thương hiệu của họ trước.

Gọi FedCM từ bên trong một iframe trên nhiều nguồn gốc

Bạn có thể gọi FedCM từ bên trong iframe nhiều nguồn bằng chính sách quyền identity-credentials-get, nếu khung mẹ cho phép. Để làm như vậy, hãy thêm thuộc tính allow="identity-credentials-get" vào thẻ iframe như sau:

  <iframe src="https://fedcm-cross-origin-iframe.glitch.me" allow="identity-credentials-get"></iframe>

Bạn có thể xem ví dụ thực tế trong ví dụ này.

Không bắt buộc: Nếu khung mẹ muốn hạn chế các nguồn gốc gọi FedCM, hãy gửi tiêu đề Permissions-Policy kèm theo danh sách các nguồn gốc được phép.

  Permissions-Policy: identity-credentials-get=(self "https://fedcm-cross-origin-iframe.glitch.me")

Bạn có thể tìm hiểu thêm về cách hoạt động của Chính sách về quyền tại phần Kiểm soát các tính năng của trình duyệt bằng Chính sách về quyền.

Login Hint API

Bằng cách sử dụng Gợi ý đăng nhập, RP có thể đề xuất tài khoản mà người dùng nên đăng nhập. Điều này có thể hữu ích cho việc xác thực lại những người dùng không chắc chắn về tài khoản mà họ đã sử dụng trước đây.

RP có thể chọn hiện một tài khoản cụ thể bằng cách gọi navigator.credentials.get() bằng thuộc tính loginHint với một trong các giá trị login_hints được tìm nạp từ điểm cuối danh sách tài khoản, như minh hoạ trong mã mẫu sau:

  return await navigator.credentials.get({
    identity: {
      providers: [{
        configURL: 'https://idp.example/manifest.json',
        clientId: '123',
        // Accounts endpoint can specify a 'login_hints' array for an account.
        // When RP specifies a 'exampleHint' value, only those accounts will be
        // shown to the user whose 'login_hints' array contains the 'exampleHint'
        // value
        loginHint : 'exampleHint'
      }]
    }
  });

Khi không có tài khoản nào khớp với loginHint, hộp thoại FedCM sẽ hiện lời nhắc đăng nhập, cho phép người dùng đăng nhập vào một tài khoản IdP khớp với gợi ý mà RP yêu cầu. Khi người dùng nhấn vào lời nhắc, một cửa sổ bật lên sẽ mở ra với URL đăng nhập được chỉ định trong tệp cấu hình. Sau đó, đường liên kết sẽ được thêm các tham số truy vấn gợi ý đăng nhập và gợi ý về miền.

Domain Hint API

RP có thể chọn chỉ hiển thị những tài khoản được liên kết với một miền nhất định. Điều này có thể hữu ích cho những RP bị hạn chế trong một miền doanh nghiệp.

Để chỉ hiển thị các tài khoản thuộc một miền cụ thể, RP phải gọi navigator.credentials.get() bằng thuộc tính domainHint với một trong các giá trị domain_hints được tìm nạp từ điểm cuối danh sách tài khoản, như trong mẫu mã sau:

  return await navigator.credentials.get({
    identity: {
      providers: [{
        configURL: 'https://idp.example/manifest.json',
        clientId: 'abc',
        // Accounts endpoint can specify a 'domain_hints' array for an account.
        // When RP specifies a '@domain.example' value, only those accounts will be
        // shown to the user whose 'domain_hints' array contains the
        // '@domain.example' value
        domainHint : '@domain.example'
      }]
    }
  });

Khi không có tài khoản nào khớp với domainHint, hộp thoại FedCM sẽ hiện lời nhắc đăng nhập, cho phép người dùng đăng nhập vào một tài khoản IdP khớp với gợi ý mà RP yêu cầu. Khi người dùng nhấn vào lời nhắc, một cửa sổ bật lên sẽ mở ra với URL đăng nhập được chỉ định trong tệp cấu hình. Sau đó, đường liên kết sẽ được thêm các tham số truy vấn gợi ý đăng nhập và gợi ý về miền.

Ví dụ về lời nhắc đăng nhập khi không có tài khoản nào khớp với domainHint.
Ví dụ về lời nhắc đăng nhập khi không có tài khoản nào khớp với domainHint.

Hãy xem bản minh hoạ để biết thêm thông tin.

Thông số tùy chỉnh

Tính năng Tham số tuỳ chỉnh cho phép RP cung cấp các tham số khoá-giá trị bổ sung cho điểm cuối xác nhận danh tính. Với Parameters API, RP có thể truyền các thông số bổ sung đến IdP để yêu cầu quyền đối với các tài nguyên ngoài tính năng đăng nhập cơ bản. Việc truyền các tham số bổ sung có thể hữu ích trong những trường hợp sau:

  • RP cần yêu cầu thêm các quyền khác mà IdP có, chẳng hạn như địa chỉ thanh toán hoặc quyền truy cập vào lịch. Người dùng có thể uỷ quyền cho các quyền này thông qua một quy trình trải nghiệm người dùng do IdP kiểm soát, được khởi chạy bằng tính năng Tiếp tục trên và sau đó IdP sẽ chia sẻ thông tin này.

Để sử dụng API này, RP sẽ thêm các tham số vào thuộc tính params dưới dạng một đối tượng trong lệnh gọi navigator.credentials.get():

  let {token} = await navigator.credentials.get({
    identity: {
      providers: [{
        clientId: '1234',
        configURL: 'https://idp.example/fedcm.json',
        // Key/value pairs that need to be passed from the
        // RP to the IdP but that don't really play any role with
        // the browser.
        params: {
          IDP_SPECIFIC_PARAM: '1',
          foo: 'BAR'
        }
      },
    }
  });

Trình duyệt sẽ tự động chuyển yêu cầu này thành yêu cầu POST tới IdP với các tham số dưới dạng một đối tượng được chuyển đổi tuần tự JSON được mã hoá bằng URL:

  // The assertion endpoint is drawn from the config file
  POST /fedcm_assertion_endpoint HTTP/1.1
  Host: idp.example
  Origin: https://rp.example/
  Content-Type: application/x-www-form-urlencoded
  Cookie: 0x23223
  Sec-Fetch-Dest: webidentity

  // params are translated into urlencoded version of `{"IDP_SPECIFIC_PARAM":"1","foo":"bar"}`
  account_id=123&client_id=client1234&params=%22%7B%5C%22IDP_SPECIFIC_PARAM%5C%22%3A1%2C%5C%22foo%5C%22%3A%5C%22BAR%5C%22%7D%22.

Nếu RP cần thêm quyền, IdP có thể cung cấp một đường liên kết chuyển hướng. Ví dụ: trong node.js:

  if (rpRequestsPermissions) {
    // Response with a URL if the RP requests additional permissions
    return res.json({
      continue_on: '/example-redirect',
    });
  }

Trường

RP có thể chỉ định thông tin người dùng mà họ cần IdP chia sẻ với họ. Thông tin này có thể bao gồm mọi tổ hợp tên, địa chỉ email, tên người dùng, số điện thoại và ảnh hồ sơ. Thông tin được yêu cầu sẽ có trong giao diện người dùng thông báo của hộp thoại FedCM.

Người dùng đăng ký sẽ thấy một thông báo cho biết idp.example sẽ chia sẻ thông tin được yêu cầu với rp.example nếu người dùng chọn đăng ký. Nếu phản hồi từ điểm cuối tài khoản không bao gồm trường mà RP yêu cầu, thì văn bản công bố sẽ không bao gồm trường này. IdP sẽ tìm hiểu tất cả các trường được yêu cầu từ điểm cuối xác nhận danh tính và quyết định xem có nên thu thập thêm quyền của người dùng để tiếp tục hay không.

Hộp thoại FedCM, bao gồm văn bản giao diện người dùng công bố sau đây: &quot;Để tiếp tục, fedcm-idp-demo.localhost sẽ chia sẻ tên người dùng và số điện thoại của bạn với trang web này&quot;.
Thông báo công bố thông tin: RP yêu cầu IdP chỉ chia sẻ tên người dùng và số điện thoại.

Để sử dụng tính năng Trường, RP nên thêm một mảng fields vào lệnh gọi navigator.credentials.get(). Các trường này có thể chứa những thuộc tính như name, email, tel, username hoặc picture. Bạn có thể mở rộng để thêm nhiều giá trị hơn trong tương lai. Yêu cầu có fields sẽ có dạng như sau:

   let { token } = await navigator.credentials.get({
    identity: {
      providers: [{
        // RP requests the IdP to share only username and profile picture
        fields: [ 'username', 'picture'],
        clientId: '1234',
        configURL: 'https://idp.example/fedcm.json',
      },
    }
  });

Trình duyệt sẽ tự động dịch yêu cầu này thành một yêu cầu HTTP đến điểm cuối xác nhận danh tính, bao gồm tham số fields do RP chỉ định, với các trường mà trình duyệt đã tiết lộ cho người dùng trong tham số disclosure_shown_for. Để đảm bảo khả năng tương thích ngược, trình duyệt cũng sẽ gửi disclosure_text_shown=true nếu văn bản công bố đã xuất hiện và các trường được yêu cầu bao gồm cả 3 trường: 'name', 'email''picture'. Từ Chrome 141, giá trị của disclosure_text_shown không cho biết liệu văn bản công bố có thực sự hiển thị cho người dùng hay không.

  POST /id_assertion_endpoint HTTP/1.1
  Host: idp.example
  Origin: https://rp.example/
  Content-Type: application/x-www-form-urlencoded
  Cookie: 0x23223
  Sec-Fetch-Dest: webidentity

  // The RP only requested to share email and picture. The browser will send `disclosure_text_shown=false`, as the 'name' field value is missing
  account_id=123&client_id=client1234&disclosure_text_shown=false&fields=email,picture&disclosure_shown_for=email,picture

Nếu fields là một mảng trống, thì tác nhân người dùng sẽ bỏ qua giao diện người dùng công bố.

Một hộp thoại ở chế độ thụ động FedCM không hiển thị thông báo trên giao diện người dùng công bố.
Thông báo công bố không xuất hiện ở chế độ thụ động. Trong luồng nút, giao diện người dùng công bố sẽ bị bỏ qua hoàn toàn.

Điều này vẫn xảy ra ngay cả khi phản hồi từ điểm cuối tài khoản không chứa mã ứng dụng khách khớp với RP trong approved_clients.

Trong trường hợp này, disclosure_text_shown được gửi đến điểm cuối xác nhận mã nhận dạng là sai trong phần nội dung HTTP:

  POST /id_assertion_endpoint HTTP/1.1
  Host: idp.example
  Origin: https://rp.example/
  Content-Type: application/x-www-form-urlencoded
  Cookie: 0x23223
  Sec-Fetch-Dest: webidentity

  account_id=123&client_id=client1234&nonce=234234&disclosure_text_shown=false

Hiện thông báo lỗi

Đôi khi, IdP có thể không phát hành được mã thông báo vì những lý do chính đáng, chẳng hạn như khi ứng dụng khách không được uỷ quyền hoặc máy chủ tạm thời không hoạt động. Nếu IdP trả về phản hồi "lỗi", thì RP có thể nắm bắt phản hồi đó và Chrome có thể thông báo cho người dùng bằng cách hiện giao diện người dùng trình duyệt kèm theo thông tin lỗi do IdP cung cấp.

Hộp thoại FedCM cho biết thông báo lỗi sau khi người dùng không đăng nhập được. Chuỗi này được liên kết với loại lỗi.
Hộp thoại FedCM cho biết thông báo lỗi sau khi người dùng không đăng nhập được. Chuỗi này được liên kết với loại lỗi.
  try {
    const cred = await navigator.credentials.get({
      identity: {
        providers: [
          {
            configURL: 'https://idp.example/manifest.json',
            clientId: '1234',
          },
        ],
      }
    });
  } catch (e) {
    const code = e.code;
    const url = e.url;
  }

Tự động xác thực lại người dùng sau lần xác thực ban đầu

Tính năng tự động xác thực lại FedCM ("auto-reauthn") có thể cho phép người dùng tự động xác thực lại. Bạn phải đáp ứng các điều kiện sau để tự động xác thực lại người dùng:

  • Trước đây, người dùng đã thực hiện quy trình xác thực ban đầu bằng FedCM. "Lần xác thực ban đầu" ở đây có nghĩa là người dùng tạo tài khoản hoặc đăng nhập vào trang web của RP bằng cách nhấn vào nút "Tiếp tục với..." trên hộp thoại đăng nhập của FedCM lần đầu tiên trên cùng một phiên bản trình duyệt.
  • Người dùng chỉ có một tài khoản trả lại. Nếu có nhiều tài khoản đang hoạt động cho nhiều IdP, người dùng sẽ không được xác thực lại tự động.

Mặc dù trải nghiệm người dùng rõ ràng có ý nghĩa trước khi người dùng tạo tài khoản liên kết để ngăn chặn hoạt động theo dõi (một trong những mục tiêu chính của FedCM), nhưng trải nghiệm này không cần thiết và gây phiền toái sau khi người dùng đã trải qua một lần: sau khi người dùng cấp quyền cho phép giao tiếp giữa RP và IdP, không có lợi ích nào về quyền riêng tư hoặc bảo mật khi thực thi một lần xác nhận rõ ràng khác của người dùng cho một việc mà họ đã xác nhận trước đó.

Với tính năng tự động xác thực lại, trình duyệt sẽ thay đổi hành vi của mình tuỳ thuộc vào lựa chọn mà bạn chỉ định cho mediation khi gọi navigator.credentials.get().

  const cred = await navigator.credentials.get({
    identity: {
      providers: [{
        configURL: 'https://idp.example/fedcm.json',
        clientId: '1234',
      }],
    },
    mediation: 'optional', // this is the default
  });

  // `isAutoSelected` is `true` if auto-reauthn was performed.
  const isAutoSelected = cred.isAutoSelected;

mediationmột thuộc tính trong API Quản lý thông tin xác thực, thuộc tính này hoạt động theo cách tương tự như đối với PasswordCredentialFederatedCredential, đồng thời được PublicKeyCredential hỗ trợ một phần. Thuộc tính này chấp nhận 4 giá trị sau:

  • 'optional'(mặc định): Tự động xác thực lại nếu có thể, yêu cầu một hoạt động trung gian nếu không. Bạn nên chọn chế độ này trên trang đăng nhập.
  • 'required': Luôn yêu cầu một hoạt động trung gian để tiếp tục, ví dụ: nhấp vào nút "Tiếp tục" trên giao diện người dùng. Chọn lựa chọn này nếu người dùng của bạn dự kiến sẽ cấp quyền một cách rõ ràng mỗi khi họ cần được xác thực.
  • 'silent': Tự động xác thực lại nếu có thể, âm thầm thất bại mà không cần yêu cầu một hoạt động trung gian nếu không. Bạn nên chọn lựa chọn này trên các trang khác ngoài trang đăng nhập chuyên dụng nhưng bạn muốn người dùng vẫn đăng nhập, chẳng hạn như trang mặt hàng trên trang web vận chuyển hoặc trang bài viết trên trang web tin tức.
  • 'conditional': Dùng cho WebAuthn và hiện không dùng được cho FedCM.

Với lệnh gọi này, quá trình xác thực lại tự động sẽ diễn ra trong các điều kiện sau:

  • Bạn có thể sử dụng FedCM. Ví dụ: người dùng chưa tắt FedCM trên toàn cầu hoặc cho RP trong phần cài đặt.
  • Người dùng chỉ sử dụng một tài khoản có FedCM API để đăng nhập vào trang web trên trình duyệt này.
  • Người dùng đã đăng nhập vào IdP bằng tài khoản đó.
  • Quá trình xác thực lại tự động không diễn ra trong 10 phút vừa qua.
  • RP chưa gọi navigator.credentials.preventSilentAccess() sau lần đăng nhập trước.

Khi các điều kiện này được đáp ứng, hệ thống sẽ bắt đầu tự động xác thực lại người dùng ngay khi navigator.credentials.get() FedCM được gọi.

Khi mediation: optional, tính năng tự động xác thực lại có thể không dùng được vì những lý do mà chỉ trình duyệt mới biết; RP có thể kiểm tra xem tính năng tự động xác thực lại có được thực hiện hay không bằng cách kiểm tra thuộc tính isAutoSelected.

Điều này hữu ích cho việc đánh giá hiệu suất API và cải thiện trải nghiệm người dùng cho phù hợp. Ngoài ra, khi không có sẵn, người dùng có thể được nhắc đăng nhập bằng hoạt động trung gian rõ ràng của người dùng, đây là một quy trình có mediation: required.

Người dùng tự động xác thực lại thông qua FedCM.

Thực thi hoạt động dàn xếp bằng preventSilentAccess()

Việc tự động xác thực lại người dùng ngay sau khi họ đăng xuất sẽ không mang lại trải nghiệm tốt cho người dùng. Đó là lý do FedCM có khoảng thời gian không hoạt động là 10 phút sau khi tự động xác thực lại để ngăn chặn hành vi này. Điều này có nghĩa là quá trình xác thực lại tự động sẽ diễn ra tối đa một lần trong mỗi 10 phút, trừ phi người dùng đăng nhập lại trong vòng 10 phút. RP nên gọi navigator.credentials.preventSilentAccess() để yêu cầu trình duyệt tắt tính năng tự động xác thực lại một cách rõ ràng khi người dùng đăng xuất khỏi RP một cách rõ ràng, chẳng hạn như bằng cách nhấp vào nút đăng xuất.

  function signout() {
    navigator.credentials.preventSilentAccess();
    location.href = '/signout';
  }

Người dùng có thể chọn không sử dụng tính năng tự động xác thực lại trong phần cài đặt

Người dùng có thể chọn không sử dụng tính năng tự động xác thực lại trong trình đơn cài đặt:

  • Trên Chrome dành cho máy tính, hãy chuyển đến phần chrome://password-manager/settings > Tự động đăng nhập.
  • Trên Chrome dành cho Android, hãy mở phần Cài đặt > Trình quản lý mật khẩu > Nhấn vào biểu tượng bánh răng ở góc trên cùng bên phải > Tự động đăng nhập.

Bằng cách tắt nút bật/tắt này, người dùng có thể chọn không sử dụng hành vi tự động xác thực lại. Chế độ cài đặt này được lưu trữ và đồng bộ hoá trên các thiết bị, nếu người dùng đã đăng nhập vào Tài khoản Google trên phiên bản Chrome và bật tính năng đồng bộ hoá.

Ngắt kết nối IdP khỏi RP

Nếu trước đây người dùng đã đăng nhập vào RP bằng IdP thông qua FedCM, thì mối quan hệ này sẽ được trình duyệt ghi nhớ cục bộ dưới dạng danh sách các tài khoản được kết nối. RP có thể bắt đầu ngắt kết nối bằng cách gọi hàm IdentityCredential.disconnect(). Bạn có thể gọi hàm này từ một khung RP cấp cao nhất. RP cần truyền một configURL, clientId mà RP sử dụng trong IdP và một accountHint để ngắt kết nối IdP. Gợi ý về tài khoản có thể là một chuỗi tuỳ ý miễn là điểm ngắt kết nối có thể xác định tài khoản, ví dụ: địa chỉ email hoặc mã nhận dạng người dùng không nhất thiết phải khớp với mã nhận dạng tài khoản mà điểm cuối danh sách tài khoản đã cung cấp:

  // Disconnect an IdP account 'account456' from the RP 'https://idp.com/'. This is invoked on the RP domain.
  IdentityCredential.disconnect({
    configURL: 'https://idp.com/config.json',
    clientId: 'rp123',
    accountHint: 'account456'
  });

IdentityCredential.disconnect() trả về Promise. Lệnh hứa này có thể đưa ra một ngoại lệ vì những lý do sau:

  • Người dùng chưa đăng nhập vào RP bằng IdP thông qua FedCM.
  • API được gọi từ bên trong một iframe mà không có chính sách về quyền FedCM.
  • configURL không hợp lệ hoặc thiếu điểm cuối ngắt kết nối.
  • Không vượt qua được bước kiểm tra Chính sách bảo mật nội dung (CSP).
  • Có một yêu cầu ngắt kết nối đang chờ xử lý.
  • Người dùng đã tắt FedCM trong phần cài đặt trình duyệt.

Khi điểm cuối ngắt kết nối của IdP trả về một phản hồi, RP và IdP sẽ bị ngắt kết nối trên trình duyệt và lời hứa sẽ được giải quyết. Mã nhận dạng của các tài khoản bị ngắt kết nối được chỉ định trong phản hồi từ điểm cuối ngắt kết nối.

Các bước tiếp theo

Xem lại cách triển khai giải pháp danh tính bằng FedCM ở phía Nhà cung cấp dịch vụ danh tính.
Khám phá cách người dùng và nhà phát triển có thể quản lý việc tham gia FedCM, bao gồm cả việc chọn tham gia hoặc không tham gia trên các nền tảng và trang web.