我正在开发基于与服务器通信的iPhone应用程序,我想使用Facebook身份验证机制 .
基本上,我认为它应该像这样工作:
-
在我的iPhone应用程序中,用户使用他的电子邮件和密码登录Facebook .
-
用户可以访问相关Facebook应用程序的数据 .
-
我的iPhone应用程序在成功登录后收到访问令牌 .
-
在与我的服务器进一步通信时,我的iPhone应用程序应该使用收到的Facebook访问令牌(例如:在查询中) .
-
当我的服务器从iPhone应用程序收到一些带有访问令牌的查询时,它应该询问Facebook这个令牌是否有效(以及对谁),如果是,服务器应该假定该用户已通过Facebook验证 .
我的问题是:如果给定的访问令牌有效,服务器应该如何询问Facebook?我想我应该以某种方式检查令牌是否对我的Facebook应用程序有效 .
我已经尝试了很多Facebook查询到图形API,我发现,但没有任何工作像我预期的那样 . 你能举个例子吗?
8 回答
我假设您已经拥有了访问令牌 . 在这种情况下,验证访问令牌的最简单方法是发出以下请求
这里用您拥有的访问令牌替换@accesstoken . 我将细分网址并解释每个网址 .
我们在此处发出图表api请求,该请求将访问令牌所有者的Facebook用户ID作为JSON字符串返回 . 关键字“me”表示当前登录的用户或访问令牌的所有者 . 对于此请求,访问令牌是必需参数 .
如果提供的访问令牌无效或过期Facebook将只返回某种错误消息 .
对于有效的访问令牌,结果将以某种方式看起来像这样
这是一个两步过程,您可以使用它来验证用户访问令牌是否属于您的应用:
1) Generate an App Access token
(https://developers.facebook.com/docs/howtos/login/login-as-app/)
2) Debug the User Access token
(https://developers.facebook.com/docs/howtos/login/debugging-access-tokens/)
其中INPUT_TOKEN是您要验证的用户访问令牌,ACCESS_TOKEN是您从步骤1获得的应用程序令牌 .
调试 endpoints 基本上会转储有关令牌的所有信息,因此它会响应如下:
如果该令牌不是来自“您的应用”,那么它将返回错误响应 .
另一种解决方案是使用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 .
在最新版本的facebook(2.2)中你可以这样做:
样本输出:
您可以从GitHub下载适用于PHP的Facebook SDK .
如果用户已经通过了你声称属于他们的Facebook UID并且你想要检查它是否合法,那么这是一个Python函数,它将根据他们的访问令牌验证它(Robin Jome的答案的实现):
这是仅使用一个请求验证用户令牌的唯一安全方法:
注意标志“|”在上面的URL中不用作OR而是用作分隔符,填写其他字段后必须在那里 .
响应将是JSON看起来像这样:
参考:https://developers.facebook.com/docs/facebook-login/access-tokens/#apptokens(本节底部提到了上述方法)
除了访问令牌,Facebook还发送“expires_in”参数,该参数是偏移值 . 使用它来计算访问令牌何时作为NSDate到期 . 然后,当您需要执行请求时,将当前日期与到期日期进行比较 .
还尝试检查Facebook发回的状态代码和响应字符串 .