Xác thực phía máy chủ mã thông báo truy cập Facebook cho ứng dụng iPhone


112

Tôi đang phát triển ứng dụng iPhone dựa trên giao tiếp với máy chủ và tôi muốn sử dụng cơ chế xác thực của Facebook.

Về cơ bản, tôi nghĩ nó sẽ hoạt động như thế này:

  1. Trong ứng dụng iPhone của tôi, người dùng đăng nhập vào Facebook bằng email và mật khẩu của mình.
  2. Người dùng cho phép truy cập vào dữ liệu của mình cho ứng dụng Facebook liên quan.
  3. Ứng dụng iPhone của tôi nhận được mã thông báo truy cập, sau khi đăng nhập thành công.
  4. Khi liên lạc thêm với máy chủ của tôi, ứng dụng iPhone của tôi phải sử dụng mã thông báo truy cập Facebook đã nhận (ví dụ: trong truy vấn).
  5. Khi máy chủ của tôi nhận được một số truy vấn từ ứng dụng iPhone, với mã thông báo truy cập, nó sẽ hỏi Facebook rằng mã thông báo này hợp lệ (và dành cho ai), và nếu có, máy chủ sẽ giả định rằng người dùng đã được xác thực với Facebook.

Câu hỏi của tôi là: làm thế nào máy chủ sẽ hỏi Facebook nếu mã thông báo truy cập được cấp có hợp lệ không? Tôi nghĩ bằng cách nào đó tôi nên kiểm tra xem mã thông báo có hợp lệ cho ứng dụng Facebook của mình hay không.

Tôi đã thử nhiều truy vấn Facebook để vẽ biểu đồ API mà tôi đã tìm thấy, nhưng không có gì hoạt động như tôi mong đợi. Bạn có thể cung cấp cho tôi một số ví dụ?


5
Trừ khi người dùng đã đăng xuất khỏi ứng dụng trong FB, bạn chỉ có thể gửi mã thông báo xác thực đến máy chủ (ssl hopefuly). Một truy vấn đơn giản về "/ me" qua api biểu đồ thành công hay thất bại?
The Mad Gamer,

bạn sẽ nhận được tin nhắn phản hồi từ trong facebook rằng thẻ của bạn không phải là :) hợp lệ
Jean-Luc Godard

1
Tôi đang cố gắng làm điều gì đó rất giống với những gì bạn đang làm. Bạn chưa bao giờ đánh dấu câu hỏi này là đã trả lời, bạn đã bao giờ làm cho câu hỏi này hoạt động chưa?
tạm thời

Điều gì xảy ra khi access_token hết hạn? chúng ta có nên yêu cầu người dùng đăng nhập lại không? tôi muốn hiểu cách xác thực lại sau khi mã thông báo hết hạn
debianmaster

@debianmaster nó phụ thuộc vào kiến ​​trúc ứng dụng của bạn. Nếu bạn xem xét trường hợp "không có mã thông báo FB - không có quyền truy cập vào ứng dụng", hơn là có, hãy đăng xuất người dùng. Nếu không, bạn có thể xem xét logic "hủy liên kết", trong đó người dùng vẫn đăng nhập, nhưng thông tin nhận được từ Facebook được tách ra khỏi tài khoản của anh ta trên máy chủ / ứng dụng khách.
Yevhen Dubinin

Câu trả lời:


115

Đây là quy trình hai bước bạn có thể sử dụng để xác thực rằng mã thông báo truy cập người dùng thuộc về Ứng dụng của bạn:

1) Tạo mã thông báo Truy cập ứng dụng

( https://developers.facebook.com/docs/howtos/login/login-as-app/ )

https://graph.facebook.com/oauth/access_token?
client_id=YOUR_APP_ID
&client_secret=YOUR_APP_SECRET
&grant_type=client_credentials

2) Gỡ lỗi mã thông báo Truy cập Người dùng

( https://developers.facebook.com/docs/howtos/login/debugging-access-tokens/ )

https://graph.facebook.com/debug_token?
input_token=INPUT_TOKEN
&access_token=ACCESS_TOKEN

Trong đó INPUT_TOKEN là mã thông báo truy cập của người dùng mà bạn muốn xác minh và ACCESS_TOKEN là mã thông báo của ứng dụng mà bạn nhận được từ bước 1.

Điểm cuối gỡ lỗi về cơ bản kết xuất tất cả thông tin về mã thông báo, vì vậy nó sẽ phản hồi với những thứ như sau:

{
    data: {
        app_id: YOUR_APP_ID,
        is_valid: true,
        metadata: {
            sso: "iphone-safari"
        },
        application: YOUR_APP_NAMESPACE,
        user_id: USER_ID,
        issued_at: 1366236791,
        expires_at: 1371420791,
        scopes: [ ]
    }
}

Nếu mã thông báo đó không phải từ "ứng dụng của bạn" thì nó sẽ trả về phản hồi lỗi.


13
Theo Facebook , đây là cách chính xác để kiểm tra token. Tuy nhiên, phần đầu tiên là tùy chọn vì bạn có thể sử dụng id và bí mật ứng dụng của mình thay vì mã thông báo quản trị hoặc ứng dụng.
Brandon Zacharie

@BrandonZacharie Không biết bạn thực hiện việc này như thế nào, tôi vừa thử với id ứng dụng và bí mật và đã đưa ra lỗi cho "thông số input_token bắt buộc"
Johnny Z

@JohnnyZ mã thông báo đầu vào là bắt buộc. Mã thông báo truy cập là nơi có tính linh hoạt.
Brandon Zacharie

8
@BrandonZacharie Bạn nói đúng, tôi đã nhầm lẫn đầu vào và mã thông báo truy cập. Để sử dụng id và bí mật của ứng dụng, tôi đã chuyển vào thông số này dưới dạng một tham số với đường ống là dấu phân cách: & access_token = APP_ID | APP_SECRET
Johnny Z


115

Cập nhật: câu trả lời này có vẻ không an toàn vì nó không xác thực mã thông báo trước tiên thuộc về ứng dụng của bạn, hãy xem các nhận xét, câu trả lời ban đầu như sau:

Tôi giả sử rằng bạn đã có mã thông báo truy cập trong tay. Trong trường hợp này, cách đơn giản nhất để xác thực mã thông báo truy cập là đưa ra yêu cầu sau

https://graph.facebook.com/me?fields=id&access_token=@accesstoken

Tại đây, hãy thay thế @accesstoken bằng mã thông báo truy cập mà bạn có. Tôi sẽ phân tích url và sẽ giải thích từng thứ.

Chúng tôi đang đưa ra một yêu cầu api biểu đồ tại đây, yêu cầu này sẽ trả về ID người dùng Facebook của chủ sở hữu mã thông báo truy cập dưới dạng chuỗi JSON. Từ khóa 'tôi' đại diện cho người dùng hiện đang đăng nhập hoặc chủ sở hữu của mã thông báo truy cập. Đối với yêu cầu này, mã thông báo truy cập là một tham số bắt buộc.

Nếu mã thông báo truy cập được cung cấp không hợp lệ hoặc hết hạn, Facebook sẽ chỉ trả lại một thông báo lỗi nào đó.

Đối với mã thông báo truy cập hợp lệ, kết quả bằng cách nào đó sẽ giống như thế này

{
   "id": "ID_VALUE"
}

14
Yêu cầu đó sẽ không thành công nếu người dùng đó cung cấp access_token thuộc về một ứng dụng khác?
Yuriy Nemtsov

2
Bất kỳ mã thông báo truy cập người dùng hợp lệ nào đều có thể được sử dụng (bất kể nó thuộc về ứng dụng nào)
Robin

12
@Xiquid bài đăng này không phải là giải pháp cho vấn đề vì nó không xác thực nếu mã thông báo truy cập thuộc về ứng dụng của bạn.
Kolyunya

12
Tôi không hiểu tại sao câu trả lời này lại có nhiều lượt bình chọn nhất! Đó hoàn toàn không phải là giải pháp phù hợp. Trên thực tế, cách tiếp cận chính xác là những gì "sebastian cua" đã đề xuất. Điểm cuối debug_token được sử dụng để truy vấn thông tin về chính mã thông báo và bằng cách này, bạn có thể xác minh rằng mã thông báo thuộc về một ID người dùng cụ thể cho một ID ứng dụng cụ thể!
Alex Ntousias

4
Vâng, câu trả lời này không đúng. Nếu bạn xác minh mã thông báo truy cập theo cách này, ai đó có thể lấy mã thông báo truy cập từ một ứng dụng khác và sử dụng nó để xác thực với của bạn.
Jonathan

11

Một giải pháp khác sẽ là sử dụng https://graph.facebook.com/app/?access_token=[user_access_token]như được mô tả bởi Lấy id ứng dụng từ mã thông báo truy cập của người dùng (hoặc xác minh ứng dụng nguồn để lấy mã thông báo) .

Đây có vẻ là một tính năng không có giấy tờ, nhưng trả về JSON chứa id của ứng dụng mà mã thông báo được tạo. Nếu mã thông báo không dành cho ứng dụng của bạn, nó sẽ trả về 400.


Làm thế nào tôi có thể nhận được xếp hạng của các doanh nghiệp khác trên Facebook. Tôi cần làm gì cho việc này?
Maneesh Rao

6

Trong phiên bản mới nhất của facebook (2.2), bạn có thể thực hiện theo cách này:

https://developers.facebook.com/docs/graph-api/reference/v2.2/debug_token

Đầu ra mẫu:

{
    "data": {
        "app_id": "THE APP ID", 
        "application": "APP NAME", 
        "expires_at": 1427245200, 
        "is_valid": true, 
        "scopes": [
        "public_profile", 
        "basic_info", 
        "read_stream", 
        "email", 
        "publish_actions", 
        "read_friendlists", 
        "user_birthday", 
        "user_hometown", 
        "user_location", 
        "user_likes", 
        "user_photos", 
        "user_videos", 
        "user_friends", 
        "user_posts"
        ], 
        "user_id": "THE USER ID"
    }
}

Điều này có nghĩa là bạn sẽ phải gọi điểm cuối fb này theo mỗi yêu cầu? Không có cách nào khác?
Jdruwe

Điều này hoạt động nhưng nó yêu cầu mã thông báo truy cập. Mã thông báo truy cập có thể được tạo bằng cách sử dụng câu trả lời 'sebastian cua' hoặc chúng ta có thể chỉ cần sử dụng appid | appsecret. Thông tin thêm về nhà phát
triển.facebook.com/docs/facebook

Đây là ví dụ sử dụng điều này: stackoverflow.com/a/16947027/32453
rogerdpack

2
private function facebookRequestMe($access_token)
{
    include_once "facebook.php";

    $facebook = new Facebook(array(
        "appId" => "your_application_id",
        "secret" => "your_application_secret"
    ));
    $facebook->setAccessToken($access_token);
    return $facebook->api("/me", "GET");
}

Bạn có thể tải xuống Facebook SDK cho PHP từ GitHub .


1

Nếu người dùng đã chuyển cho bạn một UID Facebook mà họ khẳng định là của họ và bạn muốn kiểm tra xem nó có hợp pháp hay không, thì đây là một hàm Python sẽ xác minh nó dựa trên mã thông báo truy cập của họ (triển khai câu trả lời của Robin Jome):

def verify_facebook_id(id, access_token):
    import requests
    import simplejson
    params = {'fields': 'id', 'access_token': access_token}
    text = requests.get("https://graph.facebook.com/me", params=params).text
    json = simplejson.loads(text)
    response_id = json["id"]
    return response_id == id

Điều này không xác nhận rằng các dấu hiệu được tạo ra "cho ứng dụng của bạn" không may ...
rogerdpack

1

Đây là phương pháp bảo mật duy nhất để xác minh mã thông báo của người dùng chỉ bằng một yêu cầu:

https://graph.facebook.com/debug_token?input_token={token-to-inspect}&access_token={app_id}|{app_secret}

Lưu ý rằng dấu "|" trong URL ở trên không được sử dụng dưới dạng HOẶC mà là dấu phân cách và phải ở đó sau khi điền vào các trường khác.

Phản hồi sẽ là JSON trông như thế:

{
    data: {
        app_id: {app_id},
        application: {app_name},
        expires_at: {some_number},
        is_valid: {true|false}
        scopes: {array_of_permissions},
        user_id: {user_id}
    }
}

Tham khảo: https://developers.facebook.com/docs/facebook-login/access-tokens/#apptokens (phương pháp trên được đề cập ở cuối phần này)


Có một cách an toàn với một yêu cầu: stackoverflow.com/a/36555287/32453
rogerdpack

-1

Cùng với mã thông báo truy cập, Facebook cũng gửi tham số "expires_in", là giá trị bù đắp. Sử dụng điều đó để tính toán thời điểm mã thông báo truy cập sẽ hết hạn dưới dạng NSDate. Sau đó, khi bạn cần thực hiện một yêu cầu, hãy so sánh ngày hiện tại với ngày hết hạn.

Cũng cố gắng kiểm tra mã trạng thái và chuỗi phản hồi mà Facebook gửi lại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.