iPhone 应用程序的 Facebook 访问令牌服务器端验证

问题描述:

我正在开发基于与服务器通信的 iPhone 应用程序,我想使用 Facebook 身份验证机制.

I'm developing iPhone application, that is based on communication with server, and I want to use Facebook authentication mechanisms.

基本上,我认为它应该像这样工作:

Basically, I think it should work like this:

  1. 在我的 iPhone 应用中,用户使用他的电子邮件和密码登录 Facebook.
  2. 用户允许访问其相关 Facebook 应用程序的数据.
  3. 成功登录后,我的 iPhone 应用收到访问令牌.
  4. 为了与我的服务器进一步通信,我的 iPhone 应用程序应该使用收到的 Facebook 访问令牌(例如:在查询中).
  5. 当我的服务器从 iPhone 应用收到一些带有访问令牌的查询时,它应该询问 Facebook 该令牌是否有效(以及适用于谁),如果是,服务器应假定用户已通过 Facebook 进行身份验证.

我的问题是:如果给定的访问令牌有效,服务器应该如何询问 Facebook?我想我应该以某种方式检查令牌是否对我的 Facebook 应用有效.

My question is: how the server should ask Facebook if given access token is valid? I think I should somehow check if the token is valid for my Facebook app.

我已经尝试了许多 Facebook 查询来绘制 API,我发现这些查询都没有按我的预期工作.你能给我举个例子吗?

I've tried many Facebook queries to graph API, that I've found, but nothing worked as I expected. Can you provide me some example?

这里有一个两步过程,可用于验证用户访问令牌是否属于您的应用:

Here's a two step process you can use to validate that a user access token belongs to your App:

1) 生成应用访问令牌

(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) 调试用户访问令牌

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

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

其中 INPUT_TOKEN 是您要验证的用户访问令牌,ACCESS_TOKEN 是您从第 1 步获得的应用令牌.

Where INPUT_TOKEN is the user access token you want to verify, and ACCESS_TOKEN is your app's token that you got from step 1.

调试端点基本上会转储有关令牌的所有信息,因此它会以如下方式响应:

The debug endpoint basically dumps all information about a token, so it'll respond with something like this:

{
    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: [ ]
    }
}

如果该令牌不是来自您的应用",那么它将返回错误响应.

If that token isn't from "your app" then it will return an error response.