2011-10-13 17 views
23

Tôi đang xây dựng một ứng dụng với các khối như sau:Facebook xác thực đến máy chủ của tôi sử dụng Android

Android - Client Side, Java Servlets - Sever Side, ứng dụng Facebook - được sử dụng để authenicate người sử dụng và làm việc với dữ liệu của họ.

Vấn đề của tôi là: Tôi muốn xác thực người dùng của mình qua facebook (chẳng hạn như yêu cầu được gửi từ ứng dụng khách android bằng facebook-android-sdk tới facebook) nhưng sau đó tôi muốn gửi yêu cầu tới máy chủ của tôi (được thực hiện bởi servlets) và để xác nhận bằng cách nào đó mà người dùng gửi yêu cầu được xác thực đến facebook và ứng dụng của tôi.

Vì vậy, đây là các bước:

người dùng X được tự động truy cập vào facebook và ứng dụng facebook của tôi bằng facebook-android-sdk. X đang gửi yêu cầu đến máy chủ của tôi

Đối với máy chủ, tôi chỉ muốn biết đó là người dùng thích hợp làm việc với tôi, tôi không cần máy chủ thực hiện bất kỳ yêu cầu API đồ thị nào.

Làm thế nào tôi có thể biết rằng X là hợp lệ trong máy chủ của tôi? Việc xác thực được thực hiện ở phía máy khách trong trường hợp đó.

Trả lời

53

Vì vậy, bạn có: Facebook - Ứng dụng Android - Máy chủ web của bạn. Và máy chủ web của bạn cần biết rằng bạn là người dùng Facebook bạn đang trình bày. Vấn đề là bạn không thể tin tưởng máy khách Android cho bất kỳ dữ liệu nào nó cung cấp cho bạn.

tôi giải quyết vấn đề như thế này:

  1. Authenticate người dùng Facebook từ ứng dụng Android,
  2. Lấy thẻ FB auth để ứng dụng android,
  3. Forward xác thực thẻ & facebook UID từ Android vào máy chủ web,
  4. Trên máy chủ web, thực hiện cuộc gọi API Facebook bằng mã thông báo đã gửi.

Nếu cuộc gọi API Facebook từ máy chủ web trả về chứng thực hợp lệ, và user id bằng với một trình bằng ứng dụng Android, máy chủ của bạn có thể tin tưởng vào id (& bạn có thể chắc chắn rằng xác thực thực Android)

+0

Vì vậy, nếu máy chủ phải làm nhiều việc hơn thế, làm cách nào bạn biết nếu nó đã được xác thực? Thực hiện yêu cầu đến máy chủ của bạn từ ứng dụng Android đến tuyến đường cho biết liệu nó có hợp lệ hay không? – slackbot39243

+7

Xin chào, đối với bất kỳ ai đang tìm kiếm cùng một luồng người dùng. Điều này LAF không đúng. Xem điều này: https://developers.facebook.com/docs/facebook-login/security/#tokenhijacking vấn đề với giải pháp này là, tôi có thể gọi API của bạn với access_token mà người dùng đã cung cấp cho ứng dụng của tôi và sử dụng nó trên ứng dụng của bạn. –

1

câu trả lời tốt hơn cho câu hỏi này (kết hợp thông tin từ bình luận tomas.tunkl của) như sau:

  1. Authenticate từ ứng dụng Android
  2. Lấy thẻ FB Auth từ authenticatio n trong ứng dụng
  3. Chuyển tiếp mã thông báo và fb UID tới máy chủ web
  4. Gọi điểm cuối gỡ lỗi như được mô tả tại đây (https://developers.facebook.com/docs/facebook-login/access-tokens/debugging-and-error-handling) - điều này sẽ cung cấp cho bạn id ứng dụng của ứng dụng đã tạo mã thông báo. ĐẢM BẢO rằng id ứng dụng là ID APP CỦA BẠN (có nghĩa là nó là mã thông báo từ ứng dụng dành cho thiết bị di động của bạn), nếu không ai đó đang xâm nhập ứng dụng của bạn bằng mã thông báo từ ứng dụng khác và bạn đang bị rò rỉ dữ liệu người dùng (như thomas tunkl chỉ với url https://developers.facebook.com/docs/facebook-login/security/#tokenhijacking) . Thật tệ. Ngoài ra, hãy kiểm tra is_valid/expires_at để đảm bảo rằng nó vẫn là mã thông báo hợp lệ từ ứng dụng của bạn.

(Vì tôi đã liên kết tài liệu, tôi cũng sẽ đặt một chút thông tin từ liên kết gỡ rối và xử lý lỗi ở đây để cho biết cách thực hiện cuộc gọi và những gì bạn nhận được :)

Khi làm việc với mã thông báo truy cập, bạn có thể cần kiểm tra thông tin nào được liên kết với nó, chẳng hạn như người dùng hoặc hết hạn. Để có được thông tin này, bạn có thể sử dụng công cụ gỡ lỗi của chúng tôi hoặc bạn có thể sử dụng điểm cuối API.

Để sử dụng API, bạn có thể đưa ra một yêu cầu Graph API:

GET /debug_token? input_token={input-token}& access_token={access-token}

input_token: access token bạn muốn nhận được thông tin về

access_token: Truy cập ứng dụng của bạn dấu hiệu hay một hợp lệ mã thông báo truy cập người dùng từ nhà phát triển ứng dụng Phản hồi của lệnh gọi API là một mảng JSON chứa bản đồ các trường. Ví dụ:

{ "data": { "app_id": 000000000000000, "application": "Social Cafe", "expires_at": 1352419328, "is_valid": true, "issued_at": 1347235328, "scopes": [ "email", "publish_actions" ], "user_id": 1207059 } }

Lưu ý rằng trường issued_at không được trả lại cho thẻ truy cập trong thời gian ngắn.

Điều này sẽ đảm bảo rằng bạn có mã thông báo hợp lệ cho người dùng facebook đã được tạo từ khóa bí mật của riêng bạn cho người dùng; có nghĩa là họ đã xác thực đúng cách.

Các vấn đề liên quan