Mar*_*cin 112 iphone authentication facebook
我正在开发基于与服务器通信的iPhone应用程序,我想使用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)
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)
如果该令牌不是来自"您的应用",那么它将返回错误响应.
小智 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 发回的状态代码和响应字符串。
| 归档时间: |
|
| 查看次数: |
46163 次 |
| 最近记录: |