Lưu thông tin xác thực từ Biểu mẫu

Meggin Kearney
Meggin Kearney

Lưu thông tin xác thực từ biểu mẫu đăng nhập

Giữ cho biểu mẫu đăng ký và đăng nhập của bạn càng đơn giản càng tốt.

Lưu thông tin đăng nhập từ biểu mẫu đăng nhập để người dùng không phải đăng nhập lại khi quay lại.

Cách lưu trữ thông tin xác thực của người dùng từ biểu mẫu:

  1. Đưa autocomplete vào biểu mẫu.
  2. Ngăn gửi biểu mẫu.
  3. Xác thực bằng cách gửi yêu cầu.
  4. Lưu trữ thông tin xác thực.
  5. Cập nhật giao diện người dùng hoặc tiếp tục truy cập vào trang được cá nhân hoá.

Đưa autocomplete vào biểu mẫu

Trước khi tiếp tục, hãy kiểm tra xem biểu mẫu của bạn có chứa các thuộc tính autocomplete hay không. Điều này giúp API Quản lý thông tin xác thực tìm thấy idpassword từ biểu mẫu và tạo một đối tượng thông tin xác thực.

Điều này cũng giúp các trình duyệt không hỗ trợ API Quản lý thông tin xác thực hiểu được ngữ nghĩa của API này. Tìm hiểu thêm về tính năng tự động điền trong bài viết này của Jason Grigsby.

<form id="signup" method="post">
  <input name="email" type="text" autocomplete="username email" />
  <input name="display-name" type="text" autocomplete="name" />
  <input name="password" type="password" autocomplete="new-password" />
  <input type="submit" value="Sign Up!" />
</form>

Ngăn gửi biểu mẫu

Khi người dùng nhấn vào nút gửi, ngăn biểu mẫu gửi, điều này sẽ dẫn đến việc chuyển đổi trang:

    var f = document.querySelector('#signup');
    f.addEventListener('submit', e => {
      e.preventDefault();

Bằng cách ngăn chặn quá trình chuyển đổi trang, bạn có thể giữ lại thông tin xác thực trong khi xác minh tính xác thực của thông tin đó.

Xác thực bằng cách gửi yêu cầu

Để xác thực người dùng, hãy phân phối thông tin xác thực đến máy chủ của bạn bằng AJAX.

Ở phía máy chủ, tạo một điểm cuối (hoặc chỉ đơn giản là thay đổi một điểm cuối hiện có) phản hồi bằng mã HTTP 200 hoặc 401 để trình duyệt biết rõ liệu mật khẩu đăng ký/đăng nhập/thay đổi mật khẩu có thành công hay không.

Ví dụ:

// Try sign-in with AJAX
fetch('/signin', {
  method: 'POST',
  body: new FormData(e.target),
  credentials: 'include',
});

Lưu trữ thông tin xác thực

Để lưu trữ thông tin xác thực, trước tiên, hãy kiểm tra xem API có sẵn hay không, sau đó tạo bản sao của PasswordCredential với phần tử biểu mẫu làm đối số một cách đồng bộ hoặc không đồng bộ. Gọi navigator.credentials.store(). Nếu không có API, bạn chỉ cần chuyển tiếp thông tin hồ sơ sang bước tiếp theo.

Ví dụ về phương thức đồng bộ:

if (window.PasswordCredential) {
  var c = new PasswordCredential(e.target);
  return navigator.credentials.store(c);
} else {
  return Promise.resolve(profile);
}

Ví dụ về không đồng bộ:

if (window.PasswordCredential) {
  var c = await navigator.credentials.create({password: e.target});
  return navigator.credentials.store(c);
} else {
  return Promise.resolve(profile);
}

Sau khi yêu cầu thành công, hãy lưu trữ thông tin xác thực. (Đừng lưu trữ thông tin đăng nhập nếu yêu cầu không thành công vì làm như vậy sẽ gây nhầm lẫn cho người dùng cũ.)

Khi trình duyệt Chrome thu thập thông tin xác thực, một thông báo sẽ bật lên yêu cầu lưu trữ thông tin xác thực (hoặc nhà cung cấp liên kết).

lưu trữ thông tin xác thực
Thông báo cho người dùng đã tự động đăng nhập

Cập nhật giao diện người dùng

Nếu mọi thứ diễn ra suôn sẻ, hãy cập nhật giao diện người dùng bằng thông tin hồ sơ hoặc chuyển đến trang được cá nhân hoá.

     }).then(profile => {
       if (profile) {
         updateUI(profile);
       }
     }).catch(error => {
       showError('Sign-in Failed');
     });
    });

Ví dụ đầy đủ về mã

// Get form's DOM object
var f = document.querySelector('#signup');
f.addEventListener('submit', (e) => {
  // Stop submitting form by itself
  e.preventDefault();

  // Try sign-in with AJAX
  fetch('/signin', {
    method: 'POST',
    body: new FormData(e.target),
    credentials: 'include',
  })
    .then((res) => {
      if (res.status == 200) {
        return Promise.resolve();
      } else {
        return Promise.reject('Sign-in failed');
      }
    })
    .then((profile) => {
      // Instantiate PasswordCredential with the form
      if (window.PasswordCredential) {
        var c = new PasswordCredential(e.target);
        return navigator.credentials.store(c);
      } else {
        return Promise.resolve(profile);
      }
    })
    .then((profile) => {
      // Successful sign-in
      if (profile) {
        updateUI(profile);
      }
    })
    .catch((error) => {
      // Sign-in failed
      showError('Sign-in Failed');
    });
});

Khả năng tương thích với trình duyệt

PasswordCredential

Hỗ trợ trình duyệt

  • Chrome: 51.
  • Edge: 79.
  • Firefox: không được hỗ trợ.
  • Safari: không được hỗ trợ.

Nguồn

Hỗ trợ trình duyệt

  • Chrome: 51.
  • Edge: 79.
  • Firefox: 60.
  • Safari: 13.

Nguồn

Phản hồi