Tạo thủ công quy trình đăng nhập

Đối với ứng dụng di động, hãy sử dụng Facebook SDK dành cho iOSAndroid, rồi làm theo hướng dẫn riêng cho các nền tảng này.

Tuy nhiên, nếu bạn cần triển khai phương thức đăng nhập dựa trên trình duyệt cho một ứng dụng dành cho máy tính hoặc web mà không dùng SDK của chúng tôi, chẳng hạn như trong một chế độ xem web dành cho ứng dụng gốc trên máy tính (ví dụ: Windows 8) hoặc một quy trình đăng nhập sử dụng toàn bộ mã phía máy chủ, bạn có thể tạo quy trình Đăng nhập cho chính mình bằng cách dùng lệnh chuyển hướng trình duyệt. Hướng dẫn này sẽ đưa bạn qua từng bước của quy trình đăng nhập và cho bạn biết cách triển khai từng bước mà không dùng SDK của chúng tôi:

Để dùng phương thức Đăng nhập bằng Facebook trong ứng dụng dành cho máy tính, bạn cần nhúng một trình duyệt web (đôi khi gọi là chế độ xem web) vào ứng dụng để thực hiện quá trình đăng nhập.

Kiểm tra trạng thái đăng nhập

Các ứng dụng dùng SDK của chúng tôi có thể kiểm tra xem ai đó đã đăng nhập chưa bằng các chức năng tích hợp. Tất cả các ứng dụng khác phải tạo cách lưu trữ riêng khi một người đã đăng nhập. Khi không có chỉ báo đó, ứng dụng phải tiếp tục với giả thuyết rằng họ đã đăng xuất. Nếu ai đó đăng xuất thì ứng dụng của bạn phải chuyển hướng họ đến hộp thoại Đăng nhập vào thời điểm thích hợp — ví dụ như khi họ nhấp vào nút đăng nhập.

Đăng nhập mọi người

Dù ai đó không đăng nhập vào ứng dụng của bạn hoặc không đăng nhập vào Facebook, bạn có thể sử dụng hộp thoại Đăng nhập để nhắc họ thực hiện cả hai. Nếu không đăng nhập vào Facebook, họ sẽ được nhắc đăng nhập rồi tiếp tục đăng nhập vào ứng dụng của bạn. Quá trình này diễn ra tự động nên bạn không cần làm gì thêm để kích hoạt hành vi này.


Gọi hộp thoại Đăng nhập và cài đặt URL chuyển hướng

Ứng dụng phải bắt đầu chuyển hướng đến một điểm cuối sẽ hiển thị hộp thoại đăng nhập:

https://www.facebook.com/v8.0/dialog/oauth?
  client_id={app-id}
  &redirect_uri={redirect-uri}
  &state={state-param}

Điểm cuối này có những thông số bắt buộc sau:

  • client_id. ID của ứng dụng, có trong bảng điều khiển ứng dụng.
  • redirect_uri. URL mà bạn muốn chuyển hướng lại người đăng nhập đó. URL này sẽ ghi phản hồi từ hộp thoại Đăng nhập. Nếu sử dụng thông số này trong một chế độ xem web trong ứng dụng dành cho máy tính, bạn phải đặt thông số này thành https://www.facebook.com/connect/login_success.html. Bạn có thể xác nhận rằng URL này được đặt cho ứng dụng của bạn trong Bảng điều khiển ứng dụng. Bên dưới Sản phẩm trong menu điều hướng bên trái của Bảng điều khiển ứng dụng, hãy nhấp vào Đăng nhập bằng Facebook, sau đó nhấp vào Cài đặt. Xác minh URI chuyển hướng OAuth hợp lệ trong phần Cài đặt OAuth ứng dụng.
  • state. Một giá trị do ứng dụng tạo để duy trì trạng thái giữa yêu cầu và hồi đáp. Thông số này sẽ được dùng để ngăn Giả mạo yêu cầu trên trang web và sẽ được chuyển lại cho bạn, giữ nguyên, trong URI chuyển hướng.

Ví dụ: nếu yêu cầu đăng nhập của bạn có dạng như sau:

https://www.facebook.com/v8.0/dialog/oauth?
  client_id={app-id}
  &redirect_uri={"https://www.domain.com/login"}
  &state={"{st=state123abc,ds=123456789}"}

thì URI chuyển hướng sẽ được gọi bằng mã sau:

https://www.domain.com/login?state="{st=state123abc,ds=123456789}"
    

Điểm cuối còn có các thông số tùy chọn sau:

  • response_type. Xác định xem có dữ liệu phản hồi không khi chuyển hướng về ứng dụng xảy ra trong các phân đoạn hoặc thông số URL. Hãy xem phần Xác nhận danh tính để chọn loại mà ứng dụng nên dùng. Đó có thể là:
    • code. Dữ liệu phản hồi được đưa vào dưới dạng thông số URL và bao gồm thông số code (một chuỗi duy nhất được mã hóa cho mỗi yêu cầu đăng nhập). Đây là hành vi mặc định nếu thông số này không được chỉ định. Thông số này hữu ích nhất khi máy chủ của bạn xử lý mã.
    • token. Dữ liệu phản hồi được đưa vào dưới dạng phân đoạn URL và bao gồm một mã truy cập. Ứng dụng dành cho máy tính phải sử dụng cài đặt này cho response_type. Thông số này hữu ích nhất khi ứng dụng xử lý mã.
    • code%20token. Dữ liệu phản hồi được đưa vào dưới dạng phân đoạn URL và bao gồm cả một mã truy cập cũng như thông số code.
    • granted_scopes. Trả về danh sách tất cả các Quyền được phân tách bằng dấu phẩy do người dùng cấp cho ứng dụng vào lúc đăng nhập. Có thể kết hợp với các giá trị response_type khác. Khi được kết hợp với token, dữ liệu phản hồi được đưa vào dưới dạng một phân đoạn URL hoặc được đưa vào dưới dạng thông số URL.
  • scope. Một danh sách các Quyền được phân tách bằng dấu phẩy hoặc dấu cách để yêu cầu từ người dùng ứng dụng.
Đối với ứng dụng chạy trên Windows 8

Nếu đang tạo phương thức Đăng nhập cho một ứng dụng chạy trên Windows, bạn có thể sử dụng Số nhận dạng bảo mật gói làm redirect_uri của mình. Kích hoạt hộp thoại Đăng nhập bằng cách gọi WebAuthenticationBroker.AuthenticateAsync và sử dụng điểm cuối hộp thoại Đăng nhập làm requestUri. Dưới đây là một ví dụ trong JavaScript:

var requestUri = new Windows.Foundation.Uri(
  "https://www.facebook.com/v8.0/dialog/oauth?
    client_id={app-id}
    &display=popup
    &response_type=token
    &redirect_uri=ms-app://{package-security-identifier}");

Windows.Security.Authentication.Web.WebAuthenticationBroker.authenticateAsync(
  options,
  requestUri)
  .done(function (result) {
    // Handle the response from the Login Dialog
  }
);

Thao tác này sẽ đưa quy trình kiểm soát về ứng dụng của bạn với một mã truy cập khi thành công hoặc lỗi khi không thành công.

Xử lý phản hồi của hộp thoại Đăng nhập

Ở thời điểm này trong quy trình đăng nhập, người này sẽ nhìn thấy hộp thoại Đăng nhập và có lựa chọn hủy hoặc cho phép ứng dụng truy cập vào dữ liệu của họ.

Nếu người dùng ứng dụng chọn OK trên hộp thoại Đăng nhập, họ cấp quyền truy cập vào trang cá nhân công khai, danh sách bạn bè của mình và mọi Quyền bổ sung mà ứng dụng yêu cầu.

Trong mọi trường hợp, trình duyệt sẽ quay lại ứng dụng và bao gồm dữ liệu phản hồi cho biết ai đó đã kết nối hay hủy. Khi ứng dụng dùng phương thức chuyển hướng như trên, redirect_uri mà ứng dụng trả về sẽ được thêm vào với phân đoạn hoặc thông số URL (theo response_type đã chọn). Bạn cần phải ghi lại thông số này.

Vì bạn có thể sử dụng nhiều kết hợp ngôn ngữ mã khác nhau trong ứng dụng trên web nên hướng dẫn của chúng tôi không hiển thị các ví dụ cụ thể. Tuy nhiên, hầu hết các ngôn ngữ hiện đại đều có thể phân tích cú pháp URL như sau:

JavaScript phía ứng dụng có thể ghi các phân đoạn URL (ví dụ: jQuery BBQ), trong khi thông số URL có thể được ghi bằng cả mã phía máy khách và mã phía máy chủ (ví dụ: $_GET bằng PHP, jQuery.deparam bằng jQuery BBQ, querystring.parse bằng Node.js hoặc urlparse bằng Python). Microsoft cung cấp hướng dẫn và mã mẫu cho các ứng dụng chạy trên Windows 8 kết nối với một "nhà cung cấp trực tuyến" - trong trường hợp này là Facebook.

Khi dùng ứng dụng dành cho máy tính và đăng nhập, Facebook sẽ chuyển hướng mọi người đến redirect_uri được đề cập ở trên và đặt một mã truy cập cùng với một số siêu dữ liệu khác (chẳng hạn như thời hạn của mã) trong phân đoạn URI:

https://www.facebook.com/connect/login_success.html#
    access_token=ACCESS_TOKEN...

Ứng dụng cần phát hiện lệnh chuyển hướng này, rồi đọc mã truy cập từ URI bằng các cơ chế do hệ điều hành cung cấp và khung công việc phát triển mà bạn đang dùng. Sau đó, bạn có thể chuyển thẳng đến bước Kiểm tra mã truy cập.


Đã hủy đăng nhập

Nếu những người dùng ứng dụng của bạn không chấp nhận hộp thoại Đăng nhập và nhấp vào Hủy, họ sẽ được chuyển hướng đến:

YOUR_REDIRECT_URI?
 error_reason=user_denied
 &error=access_denied
 &error_description=Permissions+error.

Hãy xem phần Xử lý quyền bị thiếu để biết thêm thông tin về điều ứng dụng nên thực hiện khi mọi người từ chối đăng nhập.

Xác nhận danh tính

Vì luồng chuyển hướng này gồm các trình duyệt được chuyển hướng đến những URL trong ứng dụng của bạn từ hộp thoại Đăng nhập, lưu lượng truy cập có thể truy cập trực tiếp URL này với các phân đoạn hoặc thông số được tạo. Nếu ứng dụng cho rằng đó là những thông số hợp lệ, ứng dụng sẽ dùng dữ liệu được tạo cho những mục đích nguy hại tiềm ẩn. Do đó, ứng dụng phải xác nhận rằng người dùng ứng dụng chính là người mà bạn có dữ liệu phản hồi trước khi tạo mã truy cập cho họ. Có nhiều cách khác nhau để xác nhận danh tính, tùy thuộc vào response_type đã nhận ở trên:

  • Khi nhận được code, cần đổi mã này lấy một mã truy cập sử dụng điểm cuối. Lệnh gọi phải là từ máy chủ đến máy chủ vì lệnh gọi đó có khóa bí mật của ứng dụng. (Khóa bí mật của ứng dụng không bao giờ được trở thành mã ứng dụng.)
  • Khi nhận được token, bạn cần xác minh mã này. Bạn nên thực hiện một lệnh gọi API đến điểm cuối kiểm tra. Lệnh này sẽ cho biết người được tạo mã và ứng dụng đã tạo. Vì lệnh gọi API này yêu cầu sử dụng mã truy cập ứng dụng, vậy nên tuyệt đối không thực hiện lệnh gọi này từ ứng dụng. Thay vào đó, hãy thực hiện lệnh gọi này từ một máy chủ mà bạn có thể lưu trữ an toàn khóa bí mật của ứng dụng.
  • Khi nhận được cả codetoken, bạn phải thực hiện cả hai bước.

Lưu ý rằng bạn cũng có thể tạo thông số state của chính mình và dùng với yêu cầu đăng nhập để cung cấp chức năng bảo vệ CSRF.

Đổi mã lấy mã truy cập

Để có mã truy cập, hãy tạo yêu cầu HTTP GET đến điểm cuối OAuth sau:

GET https://graph.facebook.com/v8.0/oauth/access_token?
   client_id={app-id}
   &redirect_uri={redirect-uri}
   &client_secret={app-secret}
   &code={code-parameter}

Điểm cuối này có một số thông số bắt buộc:

  • client_id. ID của ứng dụng
  • redirect_uri. Đây là đối số bắt buộc và phải giống với request_uri gốc mà bạn đã sử dụng khi bắt đầu quá trình đăng nhập OAuth.
  • client_secret. Khóa bí mật của ứng dụng duy nhất dành cho bạn, được hiển thị trên Bảng điều khiển ứng dụng. Khóa bí mật của ứng dụng này không bao giờ được đưa vào mã phía ứng dụng hoặc trong mã nhị phân có thể giải mã. Điều cực kỳ quan trọng là khóa này được giữ bí mật hoàn toàn vì đó là vấn đề cốt lõi trong tính năng bảo mật của ứng dụng, cũng như tất những người dùng khóa bí mật đó.
  • code. Thông số nhận được từ sự chuyển hướng hộp thoại Đăng nhập ở trên.

Lưu ý: Từ v2.3 trở đi, điểm cuối này sẽ trả về phản hồi JSON phù hợp. Nếu lệnh gọi của bạn không chỉ định phiên bản, phiên bản mặc định sẽ là phiên bản khả dụng cũ nhất.

Phản hồi

Phản hồi bạn nhận được từ điểm cuối này sẽ được trả về ở định dạng JSON và nếu thành công, là:

{
  "access_token": {access-token}, 
  "token_type": {type},
  "expires_in":  {seconds-til-expiration}
}

Nếu không thành công, bạn sẽ nhận được thông báo lỗi giải thích.

Kiểm tra mã truy cập

Dù ứng dụng có dùng code hoặc token làm response_type của bạn từ hộp thoại Đăng nhập hay không, thông số đó cũng sẽ nhận được một mã truy cập. Bạn có thể thực hiện kiểm tra tự động với những mã này bằng một điểm cuối API Đồ thị:

GET graph.facebook.com/debug_token?
     input_token={token-to-inspect}
     &access_token={app-token-or-admin-token}

Điểm cuối này lấy những thông số sau:

  • input_token. Mã bạn cần kiểm tra.
  • access_token Một mã truy cập ứng dụng hoặc mã truy cập cho nhà phát triển của ứng dụng.

Phản hồi của lệnh gọi API là một chuỗi JSON có dữ liệu về mã được kiểm tra. Ví dụ:

{
    "data": {
        "app_id": 138483919580948, 
        "type": "USER",
        "application": "Social Cafe", 
        "expires_at": 1352419328, 
        "is_valid": true, 
        "issued_at": 1347235328, 
        "metadata": {
            "sso": "iphone-safari"
        }, 
        "scopes": [
            "email", 
            "publish_actions"
        ], 
        "user_id": "1207059"
    }
}

Trường thông tin app_iduser_id giúp ứng dụng của bạn xác minh xem mã truy cập có hợp lệ cho người đó và cho ứng dụng của bạn hay không. Để biết mô tả đầy đủ về các trường thông tin khác, hãy xem hướng dẫn Xem thông tin về mã truy cập.

Kiểm tra quyền

Bạn có thể gọi cạnh /me/permissions để truy xuất danh sách các quyền đã được một người dùng cụ thể cấp hoặc từ chối. Ứng dụng có thể dùng danh sách này để kiểm tra xem những quyền đã yêu cầu nào không thể dùng cho bất kỳ người dùng cụ thể nào.

Yêu cầu lại quyền bị từ chối

Đăng nhập Facebook cho phép mọi người từ chối chia sẻ một số quyền với ứng dụng. Hộp thoại Đăng nhập bao gồm một màn hình như sau:

public_profile luôn là quyền bắt buộc và bị làm mờ vì bạn không thể vô hiệu hóa quyền này.

Tuy nhiên, nếu ai đó đã bỏ chọn user_likes (Lượt thích) trong ví dụ này, việc kiểm tra /me/permissions về quyền đã được cấp sẽ trả về phản hồi sau:

{
  "data":
    [
      {
        "permission":"public_profile",
        "status":"granted"
      },
      {
        "permission":"user_likes",
        "status":"declined"
      }
    ]
}

Lưu ý rằng người này đã từ chối chứ không cấp quyền user_likes.

Bạn có thể yêu cầu lại một người cấp cho ứng dụng của bạn những quyền họ đã từ chối. Bạn nên hiển thị một màn hình cho biết lý do bạn nghĩ họ nên cấp quyền đó cho bạn rồi yêu cầu lại. Nhưng nếu bạn gọi hộp thoại Đăng nhập như trước, hộp thoại sẽ không yêu cầu quyền đó.

Đó là vì sau khi ai đó đã từ chối một quyền, hộp thoại Đăng nhập sẽ không yêu cầu lại quyền đó trừ khi bạn nói rõ lý do bạn yêu cầu lại một quyền bị từ chối.

Hãy thực hiện việc này bằng cách thêm thông số auth_type=rerequest vào URL hộp thoại Đăng nhập:

https://www.facebook.com/v8.0/dialog/oauth?
    client_id={app-id}
    &redirect_uri={redirect-uri}
    &auth_type=rerequest
    scope=email
   

Hộp thoại Đăng nhập sẽ dùng thông số này để yêu cầu lại quyền bị từ chối.

Lưu trữ mã truy cập và trạng thái đăng nhập

Tại điểm này trong luồng, bạn đã xác thực và đăng nhập cho ai đó. Ứng dụng đã sẵn sàng thực hiện lệnh gọi API thay mặt họ. Trước khi thực hiện việc đó, ứng dụng nên lưu trữ mã truy cập và trạng thái đăng nhập của người dùng ứng dụng.

Lưu trữ mã truy cập

Sau khi ứng dụng nhận được mã truy cập từ bước trước đó, mã này phải được lưu trữ để khả dụng với tất cả các phần của ứng dụng khi ứng dụng đó thực hiện lệnh gọi API. Không có quy trình cụ thể nào ở đây. Tuy nhiên, nói chung, nếu đang tạo một ứng dụng web, tốt nhất là bạn nên thêm mã làm biến của phiên để xác định phiên trình duyệt đó với một người cụ thể. Còn nếu đang tạo một ứng dụng gốc dành cho máy tính hoặc di động, bạn nên sử dụng kho dữ liệu khả dụng cho ứng dụng. Đồng thời, ứng dụng nên lưu trữ mã trong cơ sở dữ liệu cùng với user_id để xác định ứng dụng.

Vui lòng xem ghi chú của chúng tôi về kích thước mã truy cập trong tài liệu về mã truy cập.

Theo dõi trạng thái đăng nhập

Một lần nữa, ứng dụng phải lưu trữ trạng thái đăng nhập của mọi người. Điều này giúp tránh phải thực hiện các lệnh gọi bổ sung đến hộp thoại Đăng nhập. Dù chọn quy trình nào, hãy sửa đổi kiểm tra trạng thái đăng nhập để chịu trách nhiệm về việc đó.

Đăng xuất mọi người

Bạn có thể đăng xuất mọi người khỏi ứng dụng bằng cách hoàn tác mọi chỉ báo trạng thái đăng nhập bạn đã thêm, ví dụ: xóa phiên cho biết một người đã đăng nhập. Bạn cũng nên xóa mã truy cập đã lưu.

Đăng xuất ai đó không giống với việc thu hồi quyền đăng nhập (xóa xác thực đã cấp trước đó), điều có thể thực hiện riêng. Vì lý do này, hãy tạo ứng dụng sao cho ứng dụng không tự động buộc những người đã đăng xuất quay lại hộp thoại Đăng nhập.

Phát hiện khi mọi người gỡ cài đặt ứng dụng

Mọi người có thể gỡ cài đặt ứng dụng qua Facebook.com mà không cần tương tác với chính ứng dụng. Để giúp ứng dụng phát hiện khi điều này xảy ra, chúng tôi cho phép các ứng dụng cung cấp URL hồi đáp thu hồi quyền sẽ được truy vấn khi điều này xảy ra.

Bạn có thể cho phép hồi đáp thu hồi quyền qua Bảng điều khiển ứng dụng. Chỉ cần đi tới ứng dụng rồi chọn Sản phẩm, sau đó chọn Đăng nhập bằng Facebook và cuối cùng chọn Cài đặt. Một trường văn bản được cung cấp cho URL hồi đáp thu hồi quyền.

Bất cứ khi nào người dùng ứng dụng của bạn thu hồi quyền của ứng dụng, URL này sẽ được gửi một HTTP POST có chứa yêu cầu đã ký. Hãy đọc hướng dẫn phân tích cú pháp yêu cầu được đánh dấu của chúng tôi để xem cách giải mã yêu cầu này nhằm tìm ra ID người dùng đã kích hoạt hồi đáp.

Phản hồi yêu cầu xóa dữ liệu người dùng

Mọi người có thể yêu cầu một ứng dụng xóa tất cả thông tin liên quan đến họ mà ứng dụng đó nhận được từ Facebook. Để phản hồi các yêu cầu này, hãy xem Lệnh gọi lại yêu cầu xóa dữ liệu.