如何验证 Facebook 访问令牌?
Posted
技术标签:
【中文标题】如何验证 Facebook 访问令牌?【英文标题】:How to verify Facebook access token? 【发布时间】:2012-01-26 04:51:33 【问题描述】:服务器只需要做一件事;只需检查任何访问令牌的有效性。
客户端向服务器发送FB.getLoginStatus
获取的用户ID和访问令牌。正如我所料,会有任何 URL 检查访问令牌的有效性,例如 http://xxx.facebook.com/access_token?=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
。
返回它是否可用,或者是否有任何 API(服务器端)?
【问题讨论】:
为什么不直接调用 graph.facebook.com/me/permissions 呢? 另见***.com/questions/8141037/… Facebook access token server-side validation for iPhone app的可能重复 有一个不错的 UI developers.facebook.com/tools/debug/accesstoken 【参考方案1】:如果遇到错误,您可以简单地请求https://graph.facebook.com/me?access_token=xxxxxxxxxxxxxxxxx,令牌无效。如果你得到一个带有 id 属性的 JSON 对象,那么它是有效的。
不幸的是,这只会告诉您您的令牌是否有效,而不是它是否来自您的应用程序。
【讨论】:
抱歉,我的问题不清楚。问题是如何仅使用 uid 和 accessToken 验证用户。 graph.facebook.com/100000726976284?access_token=xxxxxx 例如,有没有简单的方法可以检查用户 100000726976284 的访问令牌是否为 xxxxxx。我想“已验证”文件是关键。只有当我输入正确的 xxxxxx 时,我才能在响应中看到 verify=true。 如上所述请求graph.facebook.com/me?access_token=xxxxxxxxxxxxxxxxx,然后检查您拥有的uid是否与从请求传回的id匹配。 这不会检查 access_token 是否适用于您的应用。 也不提供expires_at
信息。
downvoting,同意@EdSykes,这样你就无法检查访问令牌是否属于你的应用developers.facebook.com/docs/facebook-login/security【参考方案2】:
官方支持的方法是:
GET graph.facebook.com/debug_token?
input_token=token-to-inspect
&access_token=app-token-or-admin-token
更多信息请参见the check token docs。
一个示例响应是:
"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
【讨论】:
我认为说 facebook 更有可能引入重大更改是一种误导。他们没有在任何地方声明,他们的官方文档明确表示这是验证访问令牌的方法 @rynop,好吧,API 端点的名称是“debug_token”,它在 Facebook API 文档中标记为 Getting Info about Tokens and Debugging 的部分中进行了描述。文档的这一部分由 html 锚#debug 引用,并声明 API 是其调试工具的后端。对我来说似乎很清楚,但是从技术上讲,您是对的,没有任何地方清楚直接地说明该功能不适用于生产用途... :-) 这里的主要问题是,如果数据来自客户端,则使用 me?access_token 方法是完全错误的;因为任何网站都可以获取令牌,然后通过访问您的 api 使用它们对您的网站进行身份验证。 OP 想要检查与令牌关联的用户 ID。 /me 端点返回用户 ID,但前提是访问令牌有效(因为毕竟,令牌用于确定要返回的 哪个“我”)。所以,抓住 /me 并比较用户 ID。必须记住,每个应用程序都有自己的特殊范围的用户 ID,因此您无法将来自不同来源的 ID 与您使用自己的应用程序令牌获得的 /me 进行比较。 过去的文档可能会引用它来进行调试。但目前它表明这正是用例。【参考方案3】:将Access Token
交换为Mobile Number and Country Code
(服务器端或客户端)
您可以通过access_token
和此API
https://graph.accountkit.com/v1.1/me/?access_token=xxxxxxxxxxxx 获得mobile number
。也许,一旦您拥有了mobile number
和id
,您就可以使用它来验证 使用您的server & database
的用户。
xxxxxxxxxx
上面是Access Token
示例响应:
"id": "61940819992708",
"phone":
"number": "+91XX82923912",
"country_prefix": "91",
"national_number": "XX82923912"
将Auth Code
交换为Access Token
(服务器端)
如果你有一个Auth Code
,你可以先用这个Access Token
得到API
- https://graph.accountkit.com/v1.1/access_token?grant_type=authorization_code&code=xxxxxxxxxx&access_token=AA|yyyyyyyyyy|zzzzzzzzzz
上面的xxxxxxxxxx
、yyyyyyyyyy
和zzzzzzzzzz
分别是Auth Code
、App ID
和App Secret
。
示例响应
"id": "619XX819992708",
"access_token": "EMAWdcsi711meGS2qQpNk4XBTwUBIDtqYAKoZBbBZAEZCZAXyWVbqvKUyKgDZBniZBFwKVyoVGHXnquCcikBqc9ROF2qAxLRrqBYAvXknwND3dhHU0iLZCRwBNHNlyQZD",
"token_refresh_interval_sec": XX92000
注意 - 这是server-side
的首选,因为API
需要APP Secret
,而shared
并不意味着security reasons
。
祝你好运。
【讨论】:
【参考方案4】:只是想让你知道,直到今天我首先获得了一个应用访问令牌(通过对 Facebook 的 GET 请求),然后使用收到的令牌作为app-token-or-admin-token
in:
GET graph.facebook.com/debug_token?
input_token=token-to-inspect
&access_token=app-token-or-admin-token
但是,我刚刚意识到了一种更好的方法(另外一个好处是需要更少的 GET 请求):
GET graph.facebook.com/debug_token?
input_token=token-to-inspect
&access_token=app_id|app_secret
如 Facebook 的访问令牌文档中所述here。
【讨论】:
谢谢。其他人的注意事项:文字“|”必须包含字符(不表示“或”),如答案中链接到的页面所示:developers.facebook.com/docs/facebook-login/… 这不是不安全的吗?通过 URL 查询参数发送 app-secret 会将其暴露给服务器和 Facebook 之间“中间”的任何人,并且 HTTPS 无济于事,因为 URL 未加密。任何人都可以使用 debug_token 格式的 URL“监听”(嗅探)请求并窃取 Facebook 应用程序机密。 @Simeon ***.com/questions/499591/are-https-urls-encrypted 相当安全。 @Xeing 谢谢,我明白我的印象是错误的 :) 似乎只是 URL 的主机部分没有加密。 添加“|”有了应用程序的秘密,我终于走了。否则此 API 不起作用。【参考方案5】:可以从此网址找到应用令牌。
https://developers.facebook.com/tools/accesstoken
【讨论】:
【参考方案6】:简单请求(HTTP GET):
https://graph.facebook.com/USER_ID/access_token=xxxxxxxxxxxxxxxxx
就是这样。
【讨论】:
【参考方案7】:我从 facebook 开发者页面找到了这个官方工具,这个页面将让您关注与访问令牌相关的信息 - 应用 ID、类型、应用范围、用户上次安装此应用的方式、已发布、过期、数据访问过期、有效、起源,范围。 只需要访问令牌。
https://developers.facebook.com/tools/debug/accesstoken/
【讨论】:
以上是关于如何验证 Facebook 访问令牌?的主要内容,如果未能解决你的问题,请参考以下文章
Facebook Phonegap 插件 - 能够登录(似乎)但无法获取访问令牌
通过Console App C#将照片发布到Facebook页面