如何验证Facebook访问令牌?
服务器只需要做一件事;只需检查任何访问令牌的有效性 客户端将通过如何验证Facebook访问令牌?,facebook,Facebook,服务器只需要做一件事;只需检查任何访问令牌的有效性 客户端将通过FB.getLoginStatus获得的用户id和访问令牌发送到服务器。正如我所料,将有任何URL检查访问令牌的有效性,如http://xxx.facebook.com/access_token?=xxxxxxxxxxxxxxxxxxxxxxxxxxxx 返回是否有可用的标记,或者是否有任何API(服务器端)?如果出现错误,您只需请求,该标记无效。如果您得到一个带有id属性的JSON对象,那么它是有效的 不幸的是,这只会告诉您令牌是
FB.getLoginStatus
获得的用户id和访问令牌发送到服务器。正如我所料,将有任何URL检查访问令牌的有效性,如http://xxx.facebook.com/access_token?=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
返回是否有可用的标记,或者是否有任何API(服务器端)?如果出现错误,您只需请求,该标记无效。如果您得到一个带有id属性的JSON对象,那么它是有效的
不幸的是,这只会告诉您令牌是否有效,而不会告诉您令牌是否来自您的应用程序。官方支持的方法是:
GET graph.facebook.com/debug_token?
input_token={token-to-inspect}
&access_token={app-token-or-admin-token}
有关更多信息,请参阅
一个例子是:
{
"data": {
"app_id": 138483919580948,
"application": "Social Cafe",
"expires_at": 1352419328,
"is_valid": true,
"issued_at": 1347235328,
"metadata": {
"sso": "iphone-safari"
},
"scopes": [
"email",
"publish_actions"
],
"user_id": 1207059
}
}
为手机号码和国家/地区代码
交换访问令牌
(服务器端或客户端)
使用此API
,您可以使用access\u令牌获取手机号码。也许,一旦你有了手机号码和id
,你就可以用它来验证服务器和数据库的用户
xxxxxxxxx
以上是访问令牌
答复示例:
为访问令牌
(服务器端)交换身份验证代码
如果您使用的是Auth-code
,则可以首先使用此API
获取Access-Token
xxxxxxxxx
、yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
示例响应
注意-由于API
需要APP Secret
,出于安全原因,不打算共享的应用程序机密,因此这在服务器端是首选。
祝你好运。只是想让你知道,直到今天为止,我首先获得了一个应用程序访问令牌(通过向Facebook发送GET请求),然后将收到的令牌用作应用程序令牌或管理员令牌
:
GET graph.facebook.com/debug_token?
input_token={token-to-inspect}
&access_token={app-token-or-admin-token}
但是,我刚刚意识到一种更好的方法(需要更少的GET请求的额外好处):
如Facebook的访问令牌文档所述。可以从此url找到应用令牌
简单请求(HTTP GET):
就是这样。我从facebook开发者页面找到了这个官方工具,这个页面将向您提供以下与访问令牌相关的信息-应用程序ID、类型、应用程序范围、用户上次通过安装此应用程序、发布、过期、数据访问过期、有效、来源、范围。
只需要访问令牌
为什么不直接调用graph.facebook.com/me/permissions?另请参阅可能的重复项“有一个漂亮的UI对不起,我的问题不清楚。”。问题是如何仅使用uid和accessToken验证用户。例如,是否有任何简单的方法可以检查用户100000726976284的访问令牌是否为xxxxxx。我想“验证”文件是关键。只有当我输入正确的xxxxxx时,我才能在响应中看到verified=true。请求如上所述,然后检查您拥有的uid是否与请求返回的id匹配。这不会检查访问令牌是否用于您的应用程序。此外,在
info时也不提供expires\u。向下投票,同意@EdSykes,这样你就无法检查访问令牌是否属于你的应用。我认为说facebook更有可能引入突破性的改变是误导。他们没有说任何地方和他们的官方文件都明确表示这是验证访问的方法token@rynop,那么,API端点的名称是“debug_token”,它在Facebook API文档的一节中有描述。文档的这一部分由HTML anchor#debug引用,并声明API是其调试工具的后端。对我来说似乎很清楚,但你是对的,从技术上讲,没有任何地方明确和直接说明该功能不用于生产使用…:-)这里的主要问题是,如果数据来自客户端,那么使用me?access_令牌方法是完全错误的;由于任何站点都可以搜索令牌,然后使用它们通过访问api对站点进行身份验证。OP希望检查与令牌关联的用户ID。/me端点返回用户ID,但仅当访问令牌有效时返回(因为毕竟,令牌用于确定返回哪个“me”)。因此,抓取/me并比较用户ID。必须记住,每个应用程序都有自己的特定范围的用户ID,因此您无法将来自不同来源的ID与您使用自己应用程序令牌获得的/me进行比较。文档可能在过去有引用使用此进行调试。但目前它表明这正是用例。谢谢。其他人注意:必须包括文本“|”字符(不表示“或”),如链接到的页面中所示:这不是不安全吗?通过URL查询参数发送应用程序机密会将其暴露给服务器和Facebook之间“中间”的任何人,HTTPS不会有帮助,因为URL没有加密。任何人都可以“监听”(嗅探)带有调试令牌格式URL的请求并窃取Facebook应用程序机密。@Simeon它相当安全。@谢了,我发现我的印象是错误的:)似乎只是URL的主机部分没有加密。添加带有应用程序机密的“|”最终让我成功了。否则这个API就不能工作。
{
"id": "619XX819992708",
"access_token": "EMAWdcsi711meGS2qQpNk4XBTwUBIDtqYAKoZBbBZAEZCZAXyWVbqvKUyKgDZBniZBFwKVyoVGHXnquCcikBqc9ROF2qAxLRrqBYAvXknwND3dhHU0iLZCRwBNHNlyQZD",
"token_refresh_interval_sec": XX92000
}
GET graph.facebook.com/debug_token?
input_token={token-to-inspect}
&access_token={app-token-or-admin-token}
GET graph.facebook.com/debug_token?
input_token={token-to-inspect}
&access_token={app_id}|{app_secret}
https://graph.facebook.com/USER_ID/access_token=xxxxxxxxxxxxxxxxx