Facebook访问令牌服务器端validation的iPhone应用程序
我正在开发iPhone应用程序,即基于与服务器的通信,我想使用Facebook身份validation机制。
基本上,我认为它应该像这样工作:
- 在我的iPhone应用程序中,用户使用他的电子邮件和密码login到Facebook。
- 用户允许访问他的相关Facebook应用程序的数据。
- 我的iPhone应用程序在成功login后会收到访问令牌。
- 在进一步与我的服务器通信,我的iPhone应用程序应该使用收到的Facebook访问令牌(例如:在查询中)。
- 当我的服务器收到来自iPhone应用程序的一些查询,访问令牌时,应该询问Facebook这个令牌是否有效(以及谁),如果是的话,服务器应该假定用户使用Facebook进行了validation。
我的问题是:如果给定访问令牌是有效的,服务器应如何询问Facebook? 我想我应该以某种方式检查令牌是否对我的Facebook应用程序有效。
我已经尝试了许多Facebook查询来绘制API图,我发现,但没有按预期工作。 你能提供一些例子吗?
更新: 这个答案似乎不安全,因为它不会首先validation属于您的应用程序的标记,请参阅注释,原始答案如下:
我假设你已经有了访问令牌。 在这种情况下,validation访问令牌的最简单方法是发出以下请求
https://graph.facebook.com/me?fields=id&access_token=@accesstoken
这里用@accesstokenreplace你有的访问令牌。 我将打破url,并会解释每一个。
我们在这里发出一个图API请求,它将访问令牌所有者的Facebook用户ID作为JSONstring返回。 关键字“我”代表当前login的用户或访问令牌的所有者。 对于这个请求访问令牌是一个强制参数。
如果提供的访问令牌无效或过期,Facebook只会返回某种错误消息。
对于有效的访问令牌,结果将以某种方式看起来像这样
{ "id": "ID_VALUE" }
您可以使用以下两个步骤来validation用户访问令牌是否属于您的应用程序:
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)debugging用户访问令牌
( 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是您要validation的用户访问令牌,而ACCESS_TOKEN是您从第1步获得的应用令牌。
debugging端点基本上转储了一个令牌的所有信息,所以它会响应这样的事情:
{ 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: [ ] } }
如果该标记不是“你的应用程序”,那么它将返回一个错误响应。
另一个解决scheme是使用https://graph.facebook.com/app/?access_token=[user_access_token]
,如从用户访问令牌获取应用程序标识(或validation源应用程序的标记)所述 。
这似乎是一个未logging的function,但返回JSON,其中包含生成令牌的应用程序的ID。 如果令牌不适合您的应用程序,则会返回400。
在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" } }
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下载Facebook的PHP for PHP。
如果用户向你传递了一个他们声称是他们的Facebook UID,并且你想检查它是否合法,那么这是一个Python函数,它将根据他们的访问令牌(Robin Jome的答案的实现)validation它。
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
这是使用一个请求validation用户令牌的唯一安全方法:
https://graph.facebook.com/debug_token?input_token={token-to-inspect}&access_token={app_id}|{app_secret}
请注意,符号“|” 在上面的URL中不能用作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 (上面的方法在本节的底部提到)
随着访问令牌Facebook也发送一个“expires_in”参数,这是一个偏移值。 使用它来计算访问令牌将作为NSDate过期的时间。 然后当你需要做一个请求比较当前date和到期date。
还要尝试检查Facebook发回的状态码和响应string。