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

Mar*_*cin 112 iphone authentication facebook

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

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

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

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

我已经尝试了很多Facebook查询到图形API,我发现,但没有任何工作像我预期的那样.你能举个例子吗?

Rob*_*bin 113

更新:这个答案似乎不安全,因为它不会首先验证令牌属于您的应用程序,请参阅注释,原始答案如下:

我假设您已经拥有了访问令牌.在这种情况下,验证访问令牌的最简单方法是发出以下请求

https://graph.facebook.com/me?fields=id&access_token=@accesstoken
Run Code Online (Sandbox Code Playgroud)

这里用您拥有的访问令牌替换@accesstoken.我将细分网址并解释每个网址.

我们在此处发出图表api请求,该请求将访问令牌所有者的Facebook用户ID作为JSON字符串返回.关键字"me"表示当前登录的用户或访问令牌的所有者.对于此请求,访问令牌是必需参数.

如果提供的访问令牌无效或过期Facebook将只返回某种错误消息.

对于有效的访问令牌,结果将以某种方式看起来像这样

{
   "id": "ID_VALUE"
}
Run Code Online (Sandbox Code Playgroud)

  • 如果该用户提供了属于不同应用程序的access_token,那请求是否会成功? (14认同)
  • @Xiquid这篇文章不是问题的解决方案,因为它不验证访问令牌是否属于您的应用程序. (12认同)
  • 我不明白为什么这个答案得票最多!它显然不是正确的解决方案.实际上,正确的方法是"塞巴斯蒂安螃蟹"所建议的.debug_token端点用于查询有关令牌本身的信息,这样您就可以验证令牌是否属于特定应用ID的特定用户ID! (12认同)
  • 是的,这个答案是不正确的.如果以这种方式验证访问令牌,则有人可以从其他应用程序获取访问令牌并使用它来与您的身份验证进行身份验证. (4认同)
  • 可以使用任何有效的用户访问令牌(无论它属于哪个应用程序) (2认同)

seb*_*rab 112

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

1)生成App Access令牌

(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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

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

{
    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: [ ]
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • [根据Facebook](https://developers.facebook.com/docs/facebook-login/access-tokens/),这是检查令牌的正确方法.但是,第一部分是可选的,因为您可以使用您的应用ID和秘密而不是管理员或应用令牌. (13认同)
  • @BrandonZacharie你是对的,我得到输入和访问令牌困惑.要使用app id和secret,我将此作为参数传递给管道作为分隔符:&access_token = APP_ID | APP_SECRET (8认同)
  • 上面的链接现在是https://developers.facebook.com/docs/facebook-login/access-tokens/debugging-and-error-handling (2认同)

小智 11

另一种解决方案是使用来自用户访问令牌https://graph.facebook.com/app/?access_token=[user_access_token]Get application id所描述的(或验证源应用程序的令牌).

这似乎是一个未记录的功能,但返回包含为其生成令牌的应用程序ID的JSON.如果令牌不适合您的应用,则返回400.


小智 5

在最新版本的facebook(2.2)中你可以这样做:

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

样本输出:

{
    "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"
    }
}
Run Code Online (Sandbox Code Playgroud)


jcm*_*jcm -1

除了访问令牌之外,Facebook 还发送一个“expires_in”参数,它是一个偏移值。使用它来计算访问令牌作为 NSDate 的过期时间。然后,当您需要执行请求时,将当前日期与到期日期进行比较。

还要尝试检查 Facebook 发回的状态代码和响应字符串。