我正在开发基于与服务器通信的iPhone应用程序,我想使用Facebook身份验证机制。
基本上,我认为它应该是这样的:
我的问题是:如果给定的访问令牌有效,服务器应该如何询问Facebook?我想我应该以某种方式检查令牌是否对我的Facebook应用程序有效。
我已经尝试过很多Facebook查询到图形API,我发现,但没有任何工作像我预期的那样。你能举个例子吗?
答案 0 :(得分:113)
更新:此答案似乎不安全,因为它不会验证令牌 首先属于您的应用程序,请参阅注释,原始答案为 如下:
我假设您已拥有访问令牌。在这种情况下,验证访问令牌的最简单方法是发出以下请求
https://graph.facebook.com/me?fields=id&access_token=@accesstoken
这里用您拥有的访问令牌替换@accesstoken。我将细分网址并解释每个网址。
我们在此处发出图表api请求,该请求将访问令牌所有者的Facebook用户ID作为JSON字符串返回。关键字“me”表示当前登录的用户或访问令牌的所有者。对于此请求,访问令牌是必需参数。
如果提供的访问令牌无效或过期,Facebook将只返回某种错误消息。
对于有效的访问令牌,结果将以某种方式显示为
{
"id": "ID_VALUE"
}
答案 1 :(得分:111)
这是一个两步过程,您可以使用它来验证用户访问令牌是否属于您的应用程序:
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获得的应用程序令牌。
调试端点基本上会转储有关令牌的所有信息,因此它会响应如下:
{
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: [ ]
}
}
如果该令牌不是来自“您的应用”,那么它将返回错误响应。
答案 2 :(得分:11)
另一种解决方案是使用Get application id from user access token (or verify the source application for a token)所述的https://graph.facebook.com/app/?access_token=[user_access_token]
。
这似乎是一个未记录的功能,但返回包含为其生成令牌的应用程序ID的JSON。如果令牌不适合您的应用,则会返回400。
答案 3 :(得分: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"
}
}
答案 4 :(得分: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");
}
您可以从GitHub下载适用于PHP的Facebook SDK。
答案 5 :(得分:1)
如果用户通过了他们认为属于他们的Facebook UID并且您想要检查它是否合法,那么这是一个Python函数,将根据其访问令牌(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
答案 6 :(得分:1)
这是仅使用一个请求验证用户令牌的唯一安全方法:
https://graph.facebook.com/debug_token?input_token={token-to-inspect}&access_token={app_id}|{app_secret}
请注意标志" |"在上面的网址中,我们没有使用OR作为分隔符,填写其他字段后必须在那里。
响应将是JSON看起来像这样:
{
data: {
app_id: {app_id},
application: {app_name},
expires_at: {some_number},
is_valid: {true|false}
scopes: {array_of_permissions},
user_id: {user_id}
}
}
参考:https://developers.facebook.com/docs/facebook-login/access-tokens/#apptokens (上面的方法在本节的底部提到)
答案 7 :(得分:-1)
除了访问令牌,Facebook还会发送“expires_in”参数,这是一个偏移值。使用它来计算访问令牌何时作为NSDate到期。然后,当您需要执行请求时,将当前日期与到期日期进行比较。
还尝试检查Facebook发回的状态代码和响应字符串。