如何验证Facebook访问令牌?


108

服务器只需要做一件事。只需检查任何访问令牌的有效性即可。

客户端将服务器ID和访问令牌发送给服务器FB.getLoginStatus。如我所料,将有任何URL检查访问令牌的有效性,例如http://xxx.facebook.com/access_token?=xxxxxxxxxxxxxxxxxxxxxxxxxxxx

那会返回它是否可用,或者是否有任何API(服务器端)?


2
为什么不只打电话给graph.facebook.com/me/permissions?
Igy



Answers:


136

官方支持的方法是:

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
    }
}

24
我认为说Facebook更可能引入重大变化是一种误导。他们没有声明在任何地方,他们的官方文档清楚地表明,这是验证访问令牌的方法
Ed Sykes 2013年

1
@rynop,好,API端点的名称是“ debug_token”,在Facebook API文档中标有“ 获取有关令牌和调试的信息”的一节中对此进行了描述。HTML锚点#debug引用了本文档的这一部分,并指出该API是其调试工具的后端。对我来说似乎很清楚,但从技术上来说,您是对的,没有一个地方可以直接明确地声明该功能不适合生产使用... :-)
Jonathan Gilbert

5
这里的主要问题是,如果数据来自客户端,则使用me?access_token方法是完全错误的。因为任何站点都可以钓鱼以获取令牌,然后通过访问您的api使用它们来对您的站点进行身份验证。
srcspider 2015年

4
OP希望检查与令牌关联的用户ID。在/我端点返回用户ID,但只有当访问令牌是有效的(因为,毕竟,令牌被用来确定哪个 “我”返回)。因此,抓住/ me并比较用户ID。必须记住,每个应用程序都有其自己的特殊范围的用户ID,因此您无法将来自不同来源的ID与通过您自己的应用程序令牌获得的/ me进行比较。
乔纳森·吉尔伯特

3
过去,文档可能会使用此文档进行调试。但是目前它表明这正是用例。
AndHeiberg '16

78

您可以简单地请求https://graph.facebook.com/me?access_token=xxxxxxxxxxxxxxxxx如果出现错误,则该令牌无效。如果您获得具有id属性的JSON对象,则该对象有效。

不幸的是,这只会告诉您令牌是否有效,而不是令牌是否来自您的应用程序。


9
抱歉,我的问题不清楚。问题是如何仅使用uid和accessToken验证用户。graph.facebook.com/100000726976284?access_token=xxxxxx例如,是否有任何简单的方法来检查用户100000726976284的访问令牌是否为xxxxxx。我猜“已验证”是关键。只有当我输入正确的xxxxxx时,我才能在响应中看到authenticated = true。
所以

14
如上所述,请求 graph.facebook.com/me?access_token=xxxxxxxxxxxxxxxxx,然后检查您拥有的uid是否与从请求传递回的id匹配。
AlexQueue '10

51
这不会检查access_token是否适合您的应用。
Ed Sykes 2013年

也未提供expires_at信息。
vinesh

4
投票,同意@EdSykes,这样您就无法检查访问令牌是否属于您的应用程序开发者
。facebook.com/ docs / facebook

35

只是想让您知道,直到今天,我首先获取一个应用程序访问令牌(通过对Facebook的GET请求),然后将接收到的令牌用作app-token-or-admin-tokenin:

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的访问令牌文档此处所述


6
谢谢。其他注意事项:文字“ |” 字符必须包含(即不表示“或”)在回答链接到页面上,如下所示:developers.facebook.com/docs/facebook-login/...
麦克小号

1
这不是不安全吗?通过URL查询参数发送应用程序秘密会将其暴露给您的服务器和Facebook之间的“中间人”,而HTTPS则无济于事,因为URL未被加密。任何人都可以使用debug_token格式的URL“侦听”(嗅探)请求,并窃取Facebook应用程序秘密。
Simeon,


@Xeing谢谢,我看到我的印象不正确:)似乎只是URL的主机部分未加密。
Simeon,

1
添加“ |” 应用程序的秘密让我终于走了。否则,此API无效。
Uday

4

只需请求(HTTP GET):

https://graph.facebook.com/USER_ID/access_token=xxxxxxxxxxxxxxxxx

而已。



1

交易所Access TokenMobile Number and Country Code(服务器端或客户端)

你可以得到mobile numberaccess_token这个API https://graph.accountkit.com/v1.1/me/?access_token=xxxxxxxxxxxx。也许,一旦有了mobile numberid,就可以使用和来验证用户server & database

xxxxxxxxxx 以上是 Access Token

示例响应:

{
   "id": "61940819992708",
   "phone": {
      "number": "+91XX82923912",
      "country_prefix": "91",
      "national_number": "XX82923912"
   }
}


交易所Auth CodeAccess Token(服务器端)

如果有Auth Code,则可以首先Access Token使用-https API: //graph.accountkit.com/v1.1/access_token?grant_type=authorization_code&code=xxxxxxxxxx&access_token=AA|yyyyyyyyyy|zzzzzzzzzzzz

xxxxxxxxxxyyyyyyyyyyzzzzzzzzzz以上所述Auth CodeApp IDApp Secret分别。

范例回应

{
   "id": "619XX819992708",
   "access_token": "EMAWdcsi711meGS2qQpNk4XBTwUBIDtqYAKoZBbBZAEZCZAXyWVbqvKUyKgDZBniZBFwKVyoVGHXnquCcikBqc9ROF2qAxLRrqBYAvXknwND3dhHU0iLZCRwBNHNlyQZD",
   "token_refresh_interval_sec": XX92000
}

注-这是首选的server-side,因为API需要APP Secret它并不是要sharedsecurity reasons

祝好运。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.