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

Để cung cấp trải nghiệm người dùng tinh vi, điều quan trọng là giúp người dùng xác thực bản thân trên trang web của bạn. Người dùng đã xác thực có thể tương tác với nhau bằng một hồ sơ chuyên dụng, đồng bộ hoá dữ liệu trên các thiết bị hoặc xử lý dữ liệu khi không có mạng; danh sách này còn dài nữa. Tuy nhiên, việc tạo, ghi nhớ và nhập 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ọ phải sử dụng lại cùng một mật khẩu trên nhiều trang web. Tất nhiên, đây là một rủi ro bảo mật.

Phiên bản mới nhất của Chrome (51) hỗ trợ API Quản lý thông tin xác thực. Đây là đề xuất theo dõi tiêu chuẩn tại W3C, cung cấp cho 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.

Credential Management API 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 thông tin xác thực bằng mật khẩu cũng như thông tin xác thực liên kết và 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 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.
  • Ghi nhớ tài khoản liên kết mà người dùng đã dùng để đăng nhập.
  • Đăng nhập lại cho người dùng khi phiên hết hạn.

Trong quá trình triển khai của Chrome, thông tin xác thực sẽ được lưu trữ trong trình quản lý mật khẩu của Chrome. Nếu người dùng đăng nhập vào Chrome, họ có thể đồng bộ hoá mật khẩu của người dùng trên các thiết bị. Bạn cũng có thể chia sẻ những 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 dành cho Android để 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

Cách bạn sử dụng API Trình quản lý thông tin xác thực với trang web có thể khác nhau tuỳ thuộc vào cấu trúc của trang web. Đó có phải là ứng dụng một trang không? Đó có phải là kiến trúc cũ với hiệu ứng chuyển đổi trang không? Biểu mẫu đăng nhập chỉ nằm ở trang trên cùng không? Nút đăng nhập có ở mọi nơi không? Người dùng có thể duyệt xem trang web của bạn một cách có ý nghĩa mà không cần đăng nhập không? Tính năng liên kết có hoạt động trong cửa sổ bật lên không? Hay bạn cần tương tác trên nhiều trang?

Gần như không thể giải quyết mọi trường hợp đó, nhưng hãy xem một ứng dụng trang đơn thông thường.

  • Trang trên cùng là biểu mẫu đăng ký.
  • Khi nhấn vào nút "Đăng nhập", người dùng sẽ chuyển đến một 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 thông tin xác thực và liên kết thông thường, chẳng hạn như Đă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 có thể thêm các tính năng sau vào trang web, ví dụ:

  • Hiển thị bộ chọn tài khoản khi đăng nhập: Hiển thị giao diện người dùng bộ chọn tài khoản gốc khi người dùng nhấn vào "Đăng nhập".
  • Lưu trữ thông tin xác thực: Sau khi người dùng đăng nhập thành công, hãy đề xuất 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.
  • Điều tiết tính năng tự động đăng nhập: Sau khi người dùng đăng xuất, hãy tắt tính năng tự động đăng nhập cho lượt truy cập tiếp theo của người dùng.

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

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

Từ lúc người dùng nhấn vào nút "Đăng nhập" đến lúc chuyển đến biểu mẫu đăng nhập, bạn có thể sử dụng navigator.credentials.get() để lấy thông tin xác thực. Chrome sẽ hiển thị giao diện người dùng bộ 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 sẽ 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 sẽ bật lên để người dùng chọn một tài khoản để đăng nhập

Nhận đố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 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 xác thực bằng mật khẩu để đăng nhập

Sau khi người dùng đưa ra lựa chọn tài khoản, hàm phân giải 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ị tài khoản liên kết cho người dùng, hãy thêm federated (lấy một mảng trình cung cấp danh tính) vào các tuỳ chọn get().

Khi 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 đó có phải là PasswordCredential (type == 'password') hay FederatedCredential (type == 'federated') hay không. Nếu thông tin xác thực là FederatedCredential, bạn có thể gọi API thích hợp bằng thông tin mà thông tin xác thực đó chứa.

    });
} 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
Sơ đồ 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 loại thông tin xác thực, 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 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 liên kết các phần tử của biểu mẫu với các tham số đối tượng PasswordCredential.

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 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, phiên có thể đã hết hạn. Đừng làm phiền người dùng phải 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 được tự động đăng nhập, một thông báo sẽ bật lên.
Khi người dùng được 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ã này sẽ có dạng tương tự như mã bạn đã thấy trong phần "Hiển thị bộ chọn tài khoản khi đăng nhập". Điểm khác biệt duy nhất là bạn sẽ đặt unmediated: true.

Thao tác này sẽ phân giải 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 nồng nhiệt.
  • Người dùng đã đă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 xác thực được lưu trữ cho nguồn gốc của bạn.
  • Người dùng không đăng xuất 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

Điều phối tính năng 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 rằng người dùng sẽ không tự động đă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, khi sử dụng unmediated: true với navigator.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 mật khẩu thô không? Không. Bạn chỉ có thể lấy mật khẩu trong PasswordCredential và mật khẩu này không thể bị hiển thị bằng bất kỳ phương tiện nào.

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

Tôi có thể sử dụng API Quản lý thông tin xác thực bên trong một iframe không? API này chỉ dành cho các ngữ cảnh cấp cao nhất. Các lệnh gọi đến .get() hoặc .store() trong iframe sẽ được 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 mình trên Chrome với API Quản lý thông tin xác thực không? Bạn có thể ghi đè navigator.credentials và liên kết với Tiện ích Chrome để lấy thông tin xác thực 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.