Як перевірити маркер доступу до Facebook?


108

Є лише те, що повинен зробити сервер; просто перевірте дійсність будь-якого маркера доступу.

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

Це повертає, чи є доступний один чи ні, чи є для цього API (сервер)?


2
Чому б просто не зателефонувати на graph.facebook.com/me/permissions?
Igy



3
Є приємний розробник
tools/

Відповіді:


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
Я думаю, що вводити в оману, що фейсбук скоріше запровадить проривні зміни, вводить в оману. Вони не заявляють, що ніде і їх офіційні документи дають зрозуміти, що це спосіб підтвердити маркер доступу
Ед Сайкс

1
@rynop, ну, назва кінцевої точки API - "debug_token", і це описано в розділі документації щодо API Facebook, позначеному як Отримання інформації про маркери та налагодження . Цей розділ документації посилається на HTML-прив’язку #debug, і вказується, що API є резервним інструментом для їх налагодження. Мені здається досить зрозумілим, але ви праві, що технічно ніде чітко і прямо не сказано, що функція не призначена для використання у виробництві ... :-)
Джонатан Гілберт,

5
Основна проблема тут полягає в тому, що використання методу me? Access_token є просто неправильним, якщо дані надходять з боку клієнта; оскільки будь-який сайт може виловлювати маркери, то використовуйте їх для аутентифікації на вашому веб-сайті, звернувшись до вашого api.
srcspider

4
ОП хотів перевірити ідентифікатор користувача, пов’язаний з маркером. Кінцева точка / me повертає ідентифікатор користувача, але лише в тому випадку, якщо маркер доступу є дійсним (оскільки, зрештою, маркер використовується для визначення, яке "мені" повернути). Отже, захопіть / мені і порівняйте ідентифікатори користувачів. Потрібно пам’ятати, що кожен додаток отримує свої спеціально визначені ідентифікатори користувачів, тому ви не можете порівнювати ідентифікатори з іншого джерела з тим, що ви отримуєте, зі знаком власного додатка.
Джонатан Гілберт

3
Документи, можливо, раніше мали посилання, використовуючи це для налагодження. Але в даний час це говорить про те, що саме такий випадок використання.
AndHeiberg

78

Ви можете просто подати запит на https://graph.facebook.com/me?access_token=xxxxxxxxxxxxxxxxx, якщо ви отримали помилку, маркер недійсний. Якщо ви отримаєте об'єкт JSON з властивістю id, то він дійсний.

На жаль, це підкаже лише, якщо ваш маркер дійсний, а не якщо він прийшов з вашої програми.


9
Вибачте, моє запитання було не ясно. Проблема полягає в тому, як перевірити користувача лише за допомогою uid та accessToken. graph.facebook.com/100000726976284?access_token=xxxxxx Наприклад, чи є простий спосіб перевірити, чи маркер доступу 100000726976284 є xxxxxx. Я думаю, що "перевірений" файл є ключовим. Тільки коли я поставив правильний xxxxxx, я міг побачити перевірене = вірно у відповіді.
Тож Джа Кюн

14
Запитайте graph.facebook.com/me?access_token=xxxxxxxxxxxxxxxxx, як згадувалося вище, а потім перевірте, чи вказаний вами uid відповідає ідентифікатору, переданому назад із запиту.
AlexQueue

51
Це не перевірить, чи є access_token для вашої програми.
Ед Сайкс

Також не надає expires_atінформації.
vinesh

4
зволікаючи, погоджуйтеся з @EdSykes, таким чином ви не можете перевірити, чи маркер доступу належить вашим розробникам
docs/facebook-login/security

35

Просто хотів повідомити, що до сьогодні я спочатку отримував маркер доступу до програми (через 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/…
Майк 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 не працює.
Удай

4

Просто запитайте (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|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 .

Щасти.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.