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

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

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

  1. 在我的iPhone应用程序中,用户使用他的电子邮件和密码login到Facebook。
  2. 用户允许访问他的相关Facebook应用程序的数据。
  3. 我的iPhone应用程序在成功login后会收到访问令牌。
  4. 在进一步与我的服务器通信,我的iPhone应用程序应该使用收到的Facebook访问令牌(例如:在查询中)。
  5. 当我的服务器收到来自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。