Đơn giản hoá quy trình đăng nhập bằng API quản lý thông tin xác thực

Để mang lại trải nghiệm tinh vi cho người dùng, bạn phải giúp người dùng tự xác thực họ với trang web của bạn. Người dùng được xác thực có thể tương tác với nhau thông qua một hồ sơ riêng, đồng bộ hoá dữ liệu giữa các thiết bị hoặc xử lý dữ liệu khi không có mạng; danh sách đó cứ lặp lại. Nhưng sáng tạo, ghi nhớ và gõ phím mật khẩu thường rườm rà đối với người dùng cuối, đặc biệt là trên màn hình thiết bị di động dẫn đến việc họ sử dụng lại cùng một mật khẩu trên các trang web khác nhau. Tất nhiên rồi là một rủi ro bảo mật.

Phiên bản Chrome mới nhất (51) hỗ trợ API Quản lý thông tin xác thực. Đó là đề xuất theo dõi tiêu chuẩn tại W3C cung cấp cho các nhà phát triển quyền truy cập có lập trình vào trình quản lý thông tin xác thực của trình duyệt và giúp người dùng đăng nhập dễ dàng hơn.

API Quản lý thông tin xác thực là gì?

API Quản lý thông tin xác thực cho phép nhà phát triển lưu trữ và truy xuất mật khẩu thông tin xác thực và thông tin xác thực liên kết, đồng thời cung cấp 3 chức năng:

  • navigator.credentials.get()
  • navigator.credentials.store()
  • navigator.credentials.requireUserMediation()

Bằng cách sử dụng các API đơn giản này, nhà phát triển có thể làm được những việc mạnh mẽ như:

  • Cho phép người dùng đăng nhập chỉ bằng một lần nhấn.
  • Nhớ tài khoản được liên kết mà người dùng đã sử dụng để đăng nhập.
  • Đăng nhập lại người dùng khi phiên hết hạn.

Trong quá trình triển khai của Chrome, thông tin đăng nhập sẽ được lưu trữ trong mật khẩu của Chrome người quản lý. Nếu đã đăng nhập vào Chrome, người dùng có thể đồng bộ hoá mật khẩu của họ trên nhiều thiết bị. Bạn cũng có thể chia sẻ các mật khẩu đã đồng bộ hoá đó với các ứng dụng Android đã tích hợp API Smart Lock cho Mật khẩu cho Android để có được trải nghiệm liền mạch trên nhiều nền tảng.

Tích hợp API Quản lý thông tin xác thực với trang web của bạn

Bạn có thể thay đổi cách sử dụng API Quản lý thông tin xác thực với trang web của mình tuỳ thuộc vào cấu trúc của nó. Đó có phải là ứng dụng một trang không? Đó có phải là di sản không có chuyển đổi trang không? Có phải biểu mẫu đăng nhập chỉ nằm ở trên cùng không? Nút đăng nhập có nằm ở khắp mọi nơi không? Người dùng có thể duyệt mà không đăng nhập? Liên kết có hoạt động trong cửa sổ bật lên không? Hoặc làm yêu cầu tương tác trên nhiều trang?

Gần như không thể bao gồm tất cả các trường hợp đó, nhưng hãy xem xét ứng dụng một trang thông thường.

  • Trang trên cùng là một biểu mẫu đăng ký.
  • Bằng cách nhấn vào "Đăng nhập" , người dùng sẽ chuyển đến biểu mẫu đăng nhập.
  • Cả biểu mẫu đăng ký và biểu mẫu đăng nhập đều có các tuỳ chọn điển hình là id/mật khẩu thông tin đăng nhập và liên kết, ví dụ: bằng tính năng Đăng nhập bằng Google và Đăng nhập bằng Facebook.

Bằng cách sử dụng API Quản lý thông tin xác thực, bạn sẽ có thể thêm các thông tin sau tính năng vào trang web, ví dụ:

  • Hiển thị trình chọn tài khoản khi đăng nhập: Cho thấy giao diện người dùng của trình chọn tài khoản gốc khi người dùng nhấn vào "Đăng nhập".
  • Thông tin đăng nhập vào cửa hàng: Sau khi đăng nhập thành công, hãy đề nghị lưu trữ thông tin xác thực vào trình quản lý mật khẩu của trình duyệt để sử dụng sau này.
  • Cho phép người dùng tự động đăng nhập lại: Cho phép người dùng đăng nhập lại nếu phiên đã hết hạn.
  • Tự động đăng nhập dàn xếp: Sau khi người dùng đăng xuất, hãy tắt tính năng tự động đăng nhập lần truy cập tiếp theo của người dùng đó.

Bạn có thể trải nghiệm những tính năng này được triển khai trong trang web minh hoạ bằng mã mẫu của trang web đó.

Hiển thị Trình chọn tài khoản khi đăng nhập

Giữa một lần nhấn của người dùng vào nút "Đăng nhập" và điều hướng đến một biểu mẫu đăng nhập, bạn có thể sử dụng navigator.credentials.get() để nhận thông tin chứng chỉ. Chrome sẽ hiển thị giao diện người dùng của trình chọn tài khoản người dùng có thể chọn một tài khoản.

Giao diện người dùng của trình chọn tài khoản bật lên để người dùng chọn một tài khoản để đăng nhập.
Giao diện người dùng của trình chọn tài khoản bật lên để người dùng chọn một tài khoản để đăng nhập

Lấy đối tượng thông tin xác thực mật khẩu

Để hiển thị thông tin xác thực mật khẩu dưới dạng các tuỳ chọn tài khoản, hãy sử dụng password: true.

navigator.credentials.get({
    password: true, // `true` to obtain password credentials
}).then(function(cred) {
    // continuation
    ...

Sử dụng thông tin đăng nhập bằng mật khẩu để đăng nhập

Sau khi người dùng lựa chọn tài khoản, chức năng giải quyết sẽ nhận được thông tin xác thực mật khẩu. Bạn có thể gửi đường liên kết đến máy chủ bằng fetch():

    // continued from previous example
}).then(function(cred) {
    if (cred) {
    if (cred.type == 'password') {
        // Construct FormData object
        var form = new FormData();

        // Append CSRF Token
        var csrf_token = document.querySelector('csrf_token').value;
        form.append('csrf_token', csrf_token);

        // You can append additional credential data to `.additionalData`
        cred.additionalData = form;

        // `POST` the credential object as `credentials`.
        // id, password and the additional data will be encoded and
        // sent to the url as the HTTP body.
        fetch(url, {           // Make sure the URL is HTTPS
        method: 'POST',      // Use POST
        credentials: cred    // Add the password credential object
        }).then(function() {
        // continuation
        });
    } else if (cred.type == 'federated') {
        // continuation

Sử dụng thông tin đăng nhập được liên kết để đăng nhập

Để hiển thị các tài khoản liên kết cho người dùng, hãy thêm federated. Hàm này sẽ lấy một mảng nhà cung cấp danh tính, vào các tuỳ chọn get().

Khi có nhiều tài khoản được lưu trữ trong trình quản lý mật khẩu.
Khi nhiều tài khoản được lưu trữ trong trình quản lý mật khẩu
navigator.credentials.get({
    password: true, // `true` to obtain password credentials
    federated: {
    providers: [  // Specify an array of IdP strings
        'https://accounts.google.com',
        'https://www.facebook.com'
    ]
    }
}).then(function(cred) {
    // continuation
    ...

Bạn có thể kiểm tra thuộc tính type của đối tượng thông tin xác thực để xem thuộc tính đó có PasswordCredential (type == 'password') hoặc FederatedCredential (type == 'federated'). Nếu thông tin đăng nhập là FederatedCredential, bạn có thể gọi API thích hợp bằng thông tin chứa trong đó.

    });
} else if (cred.type == 'federated') {
    // `provider` contains the identity provider string
    switch (cred.provider) {
    case 'https://accounts.google.com':
        // Federated login using Google Sign-In
        var auth2 = gapi.auth2.getAuthInstance();

        // In Google Sign-In library, you can specify an account.
        // Attempt to sign in with by using `login_hint`.
        return auth2.signIn({
        login_hint: cred.id || ''
        }).then(function(profile) {
        // continuation
        });
        break;

    case 'https://www.facebook.com':
        // Federated login using Facebook Login
        // continuation
        break;

    default:
        // show form
        break;
    }
}
// if the credential is `undefined`
} else {
// show form
Biểu đồ quy trình quản lý thông tin xác thực.

Lưu trữ thông tin đăng nhập

Khi người dùng đăng nhập vào trang web của bạn bằng một biểu mẫu, bạn có thể sử dụng navigator.credentials.store() để lưu trữ thông tin xác thực. Người dùng sẽ được nhắc có lưu trữ mã đó hay không. Tuỳ thuộc vào về loại thông tin đăng nhập, hãy sử dụng new PasswordCredential() hoặc new FederatedCredential() để tạo đối tượng thông tin xác thực mà bạn muốn lưu trữ.

Chrome sẽ hỏi người dùng xem họ có muốn lưu trữ thông tin đăng nhập (hoặc nhà cung cấp liên kết) hay không.
Chrome sẽ hỏi người dùng xem họ có muốn lưu trữ thông tin đăng nhập (hoặc nhà cung cấp liên kết)

Tạo và lưu trữ thông tin xác thực mật khẩu từ phần tử biểu mẫu

Mã sau đây sử dụng các thuộc tính autocomplete để tự động bản đồ các phần tử của biểu mẫu thành PasswordCredential tham số của đối tượng.

HTML html <form id="form" method="post"> <input type="text" name="id" autocomplete="username" /> <input type="password" name="password" autocomplete="current-password" /> <input type="hidden" name="csrf_token" value="******" /> </form>

JavaScript

var form = document.querySelector('\#form');
var cred = new PasswordCredential(form);
// Store it
navigator.credentials.store(cred)
.then(function() {
    // continuation
});

Tạo và lưu trữ thông tin xác thực được liên kết

// After a federation, create a FederatedCredential object using
// information you have obtained
var cred = new FederatedCredential({
    id: id,                                  // The id for the user
    name: name,                              // Optional user name
    provider: 'https://accounts.google.com',  // A string that represents the identity provider
    iconURL: iconUrl                         // Optional user avatar image url
});
// Store it
navigator.credentials.store(cred)
.then(function() {
    // continuation
});
Sơ đồ quy trình đăng nhập.

Cho phép người dùng tự động đăng nhập lại

Khi người dùng rời khỏi trang web của bạn và quay lại sau, có thể phiên đã hết hạn. Không bận tâm khi người dùng nhập mật khẩu mỗi khi họ quay lại. Cho phép người dùng tự động đăng nhập lại.

Khi người dùng tự động đăng nhập, một thông báo sẽ bật lên.
Khi người dùng tự động đăng nhập, một thông báo sẽ bật lên.

Lấy đối tượng thông tin xác thực

navigator.credentials.get({
    password: true, // Obtain password credentials or not
    federated: {    // Obtain federation credentials or not
    providers: [  // Specify an array of IdP strings
        'https://accounts.google.com',
        'https://www.facebook.com'
    ]
    },
    unmediated: true // `unmediated: true` lets the user automatically sign in
}).then(function(cred) {
    if (cred) {
    // auto sign-in possible
    ...
    } else {
    // auto sign-in not possible
    ...
    }
});

Mã sẽ trông giống như những gì bạn đã thấy trong phần "Hiển thị trình chọn tài khoản khi đăng nhập" . Sự khác biệt duy nhất là bạn sẽ đặt unmediated: true.

Thao tác này sẽ giải quyết hàm ngay lập tức và cung cấp cho bạn thông tin xác thực để tự động đăng nhập người dùng. Có một vài điều kiện:

  • Người dùng đã xác nhận tính năng tự động đăng nhập trong lời chào mừng nồng nhiệt.
  • Trước đó, người dùng này đã đăng nhập vào trang web bằng API Quản lý thông tin xác thực.
  • Người dùng chỉ có một thông tin đăng nhập được lưu trữ cho máy chủ gốc của bạn.
  • Người dùng không đăng xuất một cách rõ ràng trong phiên trước đó.

Nếu không đáp ứng bất kỳ điều kiện nào trong số này, hàm sẽ bị từ chối.

Sơ đồ quy trình đối tượng thông tin xác thực

Dàn xếp quy trình tự động đăng nhập

Khi người dùng đăng xuất khỏi trang web của bạn, bạn có trách nhiệm đảm bảo đảm bảo người dùng sẽ không tự động được đăng nhập lại. Để đảm bảo điều này, API Quản lý thông tin xác thực cung cấp một cơ chế có tên là dàn xếp. Bạn có thể bật chế độ dàn xếp bằng cách gọi navigator.credentials.requireUserMediation(). Miễn là trạng thái dàn xếp của người dùng cho nguồn gốc được bật, sử dụng unmediated: truenavigator.credentials.get(), hàm đó sẽ phân giải bằng undefined.

Dàn xếp quy trình tự động đăng nhập

navigator.credentials.requireUserMediation();
Biểu đồ quy trình tự động đăng nhập.

Câu hỏi thường gặp

JavaScript trên trang web có thể truy xuất tệp thô không mật khẩu? Không. Bạn chỉ có thể lấy mật khẩu trong PasswordCredential chứ không phải có thể tiết lộ dưới bất kỳ hình thức nào.

Tôi có thể lưu trữ 3 bộ chữ số cho một mã nhận dạng bằng Chứng chỉ danh tính không API Quản lý? Hiện tại thì chưa. Ý kiến phản hồi của bạn về bản đặc tả kỹ thuật sẽ rất được đánh giá cao.

Tôi có thể sử dụng API Quản lý thông tin xác thực trong iframe không? API này chỉ dành cho các ngữ cảnh cấp cao nhất. Cuộc gọi đến .get() hoặc .store() trong iframe sẽ phân giải ngay lập tức mà không có hiệu lực.

Tôi có thể tích hợp tiện ích quản lý mật khẩu của Chrome với thông tin xác thực không? API Quản lý? Bạn có thể ghi đè navigator.credentials rồi nối với Tiện ích của Chrome để Thông tin đăng nhập get() hoặc store().

Tài nguyên

Để tìm hiểu thêm về API Quản lý thông tin xác thực, hãy xem Hướng dẫn tích hợp.