Tái xác thực

Tái xác thực cho phép ứng dụng xác nhận danh tính của một người ngay cả khi đã xác minh trước đó. Với Đăng nhập Facebook, ứng dụng của bạn có thể yêu cầu một người nhập lại mật khẩu Facebook của họ bất cứ lúc nào. Bạn có thể sử dụng tính năng này để ngăn các trường hợp người dùng đặt thiết bị ở trạng thái đăng nhập hoặc bên thứ ba tấn công phiên đăng nhập của ai đó bằng ứng dụng của bạn.

Ứng dụng nên xây dựng cơ chế riêng để chuyển giữa các tài khoản người dùng Facebook khác nhau bằng chức năng đăng xuất và không nên dựa vào chức năng tái xác thực để thực hiện điều này.

Lưu ý

SDK Android và iOS hiện không hỗ trợ tái xác thực.

Bật tính năng xác thực lại

Trong luồng đăng nhập, chúng tôi hiển thị cho bạn cách dùng hộp thoại Đăng nhập và OAuth để xác thực ai đó và yêu cầu quyền từ họ. Để buộc xác thực lại, bạn có thể làm theo các bước tương tự sau với thông số bổ sung:

Dưới đây là ví dụ minh họa việc sử dụng JavaScript SDK kích hoạt tính năng xác thực lại bằng cách dùng auth_type của reauthenticate:

FB.login(function(response) {
  // Original FB.login code
}, { auth_type: 'reauthenticate' })

Thông số auth_nonce

Thông số auth_nonce được dùng làm mã gồm chữ và số hoàn toàn tùy ý mà ứng dụng của bạn tạo ra. Quá trình tạo và định dạng mã này phụ thuộc hoàn toàn vào bạn. Ví dụ: có thể một phiên bản nhãn thời gian đã băm và một chuỗi bí mật là đủ, miễn là hoàn toàn khác biệt cho mỗi lần đăng nhập. Giá trị này cho phép ứng dụng xác định liệu một người dùng đã được xác thực lại hay chưa.

Bạn cần sửa đổi lại quy trình đăng nhập của mình để chỉ định thông số auth_nonce, ví dụ:

FB.login(function(response) {
  // Original FB.login code
}, { auth_type: 'reauthenticate', auth_nonce: '{random-nonce}' })

Để đảm bảo rằng mã ngẫu nhiên này chưa được dùng trước đó, bạn cần tạo một hàm để giao tiếp với mã kiểm tra cơ sở dữ liệu ứng dụng để xem ứng dụng đã dùng một mã ngẫu nhiên cụ thể chưa.

Dưới đây là ví dụ về cách sử dụng JavaScript (với khung làm việc jQuery) và PHP dưới dạng một hướng dẫn mà bạn có thể điều chỉnh cho thiết lập cụ thể của chính mình. Để lấy ví dụ, chúng tôi sẽ sử dụng một chuỗi được mã hóa cứng làm số ngẫu nhiên. Bạn nên thay thế nội dung này bằng lệnh gọi động đến một mã ngẫu nhiên đã tạo.

function checkNonce(access_token) {
  $.post('checkNonce.php', {access_token: access_token}, function(data) {
    if (data == 1) {
      console.log('The user has been successfully re-authenticated.');
      FB.api('/me', function(response) {
  console.log('Good to see you, ' + response.name + '.');
});
    } else {
      console.log('The nonce has been used before. Re-authentication failed.');
    }
  });
}

Lưu ý: File PHP này chỉ ngụ ý và không bao gồm đoạn mã sẽ so sánh số ngẫu nhiên đã cung cấp với cơ sở dữ liệu của ứng dụng đó. Bạn nên điều chỉnh nội dung này theo cơ sở dữ liệu và môi trường mã của chính mình:

<?php

  $access_token = $_REQUEST['access_token'];
  $graph_url = 'https://graph.facebook.com/oauth/access_token_info?'
      . 'client_id=YOUR_APP_ID&amp;access_token=' . $access_token;
  $access_token_info = json_decode(file_get_contents($graph_url));

  function nonceHasBeenUsed($auth_nonce) {
      // Here you would check your database to see if the nonce
      // has been used before. For the sake of this example, we'll
      // just assume the answer is "no".
      return false;
  }

  if (nonceHasBeenUsed($access_token_info->auth_nonce) != true) {
      echo '1';
   } else {
      echo '0';
   }
?>

Trong ví dụ này, hàm JavaScript checkNonce() sẽ được gọi sau khi nhận phản hồi mã truy cập từ hộp thoại đăng nhập xác thực lại. Hãy lấy JavaScript SDK làm ví dụ:

FB.login(function(response) {
  if (response.authResponse) {
     // Login success, check auth_nonce...
     checkNonce(response.authResponse.access_token);
  } else {
    // User cancelled
  }
}, { auth_type: 'reauthenticate', auth_nonce: '{random-nonce}' })

Lưu ý rằng auth_nonce là phần không bắt buộc trong quy trình xác thực lại. Tuy nhiên, các dứng dụng rất nên dùng quyền này, đặc biệt là khi yêu cầu reauthenticate làm auth_type.