Как проверить токен доступа Facebook?

108

Это единственное, что должен делать сервер; просто проверьте действительность любого токена доступа.

Клиенты отправляют на сервер идентификатор пользователя и токен доступа, полученные с помощью FB.getLoginStatus. Как я и ожидал, будет любой URL-адрес, который проверяет действительность токена доступа, например http://xxx.facebook.com/access_token?=xxxxxxxxxxxxxxxxxxxxxxxxxxxx.

Это возвращает, доступен ли он или нет, или есть ли для этого какой-либо API (на стороне сервера)?

Со Джэ Гён
источник
2
Почему бы просто не позвонить по телефону graph.facebook.com/me/permissions?
Igy
См. Также stackoverflow.com/questions/8141037/…
Вадим
3
Есть хороший UI developers.facebook.com/tools/debug/accesstoken
Clergyman

Ответы:

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, скорее всего, внесет критические изменения. Они нигде не заявляют об этом, и их официальные документы ясно дают понять, что это способ проверки токена доступа
Эд Сайкс,
1
@rynop, ну, имя конечной точки API - «debug_token», и оно описано в разделе документации API Facebook, озаглавленном « Получение информации о токенах и отладка» . Этот раздел документации упоминается как привязка HTML #debug, и в нем говорится, что API является серверной частью для их инструмента отладки. Мне это кажется довольно ясным, но вы правы в том, что технически нигде четко и прямо не говорится, что функция не предназначена для производственного использования ... :-)
Джонатан Гилберт
5
Основная проблема здесь в том, что использование метода me? Access_token просто неправильно, если данные поступают со стороны клиента; поскольку любой сайт может ловить токены, используйте их для аутентификации на своем сайте, получив доступ к вашему API.
srcspider 02
4
OP хотел проверить идентификатор пользователя, связанный с токеном. Конечная точка / me возвращает идентификатор пользователя, но только если токен доступа действителен (потому что, в конце концов, токен используется для определения того, какое «я» возвращать). Итак, возьмите / меня и сравните идентификаторы пользователей. Следует иметь в виду, что каждое приложение получает свои собственные идентификаторы пользователей с особым охватом, поэтому вы не можете сравнивать идентификаторы из другого источника с / me, полученным с токеном вашего собственного приложения.
Джонатан Гилберт,
3
Документы могли в прошлом использовать это для отладки. Но в настоящее время предполагается, что это именно тот вариант использования.
AndHeiberg
79

Вы можете просто запросить https://graph.facebook.com/me?access_token=xxxxxxxxxxxxxxxxx, если вы получите сообщение об ошибке, токен недействителен. Если вы получаете объект JSON со свойством id, то он действителен.

К сожалению, это только скажет вам, действителен ли ваш токен, а не получен ли он из вашего приложения.

Энди Мут
источник
9
Извините, мой вопрос не совсем ясен. Проблема в том, как проверить пользователя только с помощью uid и accessToken. graph.facebook.com/100000726976284?access_token=xxxxxx Например, есть ли простой способ проверить, является ли токен доступа пользователя 100000726976284 xxxxxx. Я полагаю, что "проверенное" поле - это ключ. Только когда я поставил правильный xxxxxx, я смог увидеть в ответе Verified = true.
Со Джэ Гён
14
Запросите graph.facebook.com/me?access_token=xxxxxxxxxxxxxxxxxxx, как упомянуто выше, а затем убедитесь, что ваш uid совпадает с идентификатором, переданным обратно из запроса.
AlexQueue 05
51
Это не будет проверять, что access_token предназначен для вашего приложения.
Эд Сайкс
Также не предоставляет expires_atинформацию.
vinesh 04
4
голосование вниз, согласитесь с @EdSykes, таким образом вы не сможете проверить, принадлежит ли токен доступа вашему приложению. developers.facebook.com/docs/facebook-login/security
nikis
36

Просто хотел сообщить вам, что до сегодняшнего дня я сначала получал токен доступа к приложению (через GET-запрос в Facebook), а затем использовал полученный токен как app-token-or-admin-tokenв:

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/…
Mike S
1
Разве это не небезопасно? Отправка секретного кода приложения через параметры запроса URL открывает его для всех, кто находится «посередине» между вашим сервером и Facebook, а HTTPS не поможет, поскольку URL-адреса не зашифрованы. Любой может просто «прослушивать» (обнюхивать) запросы с URL-адресами в формате debug_token и красть секреты приложений Facebook.
Симеон
1
@Simeon stackoverflow.com/questions/499591/are-https-urls-encrypted Это довольно безопасно.
Xeing
@Xeing, спасибо, я вижу, что у меня было неправильное впечатление :) Кажется, просто часть URL-адреса хоста не зашифрована.
Симеон
1
Добавление "|" с секретом приложения меня наконец заставили. В противном случае этот API не работает.
Удай
5

Просто запросите (HTTP GET):

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

Вот и все.

Надав Б
источник
1

Обмен Access Tokenна Mobile Number and Country Code(на стороне сервера ИЛИ на стороне клиента)

Вы можете получить его mobile numberс access_tokenпомощью этого API https://graph.accountkit.com/v1.1/me/?access_token=xxxxxxxxxxxx . Возможно, когда у вас есть 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|yyyyyyyyyyzzzzzzzzzz

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.

Удачи.

Акаши
источник