Підтвердження доступу до маркера Facebook на стороні сервера для додатка iPhone


112

Я розробляю додаток iPhone, яке базується на спілкуванні з сервером, і я хочу використовувати механізми аутентифікації Facebook.

В основному, я думаю, що це має працювати так:

  1. У своєму додатку iPhone користувач входить у Facebook, використовуючи свою електронну пошту та пароль.
  2. Користувач дозволяє отримати доступ до своїх даних для відповідного додатку Facebook.
  3. Мій додаток iPhone отримує маркер доступу після успішного входу.
  4. Для подальшого спілкування з моїм сервером мій додаток iPhone повинен використовувати отриманий маркер доступу Facebook (наприклад: у запитах).
  5. Коли мій сервер отримує запит від додатка iPhone, з маркером доступу, він повинен запитати у Facebook, що цей маркер дійсний (і для кого), і якщо так, сервер повинен вважати, що користувач має автентифікацію у Facebook.

Моє запитання: як сервер повинен запитати Facebook, якщо даний маркер доступу є дійсним? Я думаю, я повинен якось перевірити, чи маркер дійсний для моєї програми Facebook.

Я спробував багато запитів у Facebook, щоб побудувати графік API, який я знайшов, але нічого не вийшло, як я очікував. Ви можете надати мені якийсь приклад?


5
Якщо користувач не вийшов з програми в FB, ви можете просто надіслати маркер авт на сервер (ssl надійно). Чи простий запит "/ me" через графік api успішний чи невдалий?
Божевільний геймер

ви отримаєте повідомлення у відповідь з facebook, що ваш маркер недійсний :)
Жан-Люк Годар

1
Я намагаюся зробити щось дуже схоже на те, що ти робиш. Ви ніколи не позначали це питання як відповідь, чи працювали ви коли-небудь?
темпі

Що відбувається, коли закінчується термін дії доступу_token? чи потрібно просити користувача знову ввійти? я хочу зрозуміти, як знову перевірити його після закінчення терміну дії
debianmaster

@debianmaster це залежить від вашої архітектури додатків. Якщо ви вважаєте випадок "відсутність токена FB - немає доступу до програми", ніж так, вийдіть із користувача. В іншому випадку ви можете розглянути логіку "відключення", коли користувач залишається ввійшов у систему, але інформація, отримана від Facebook, відлучається від його облікового запису на сервері / клієнті.
Євген Дубінін

Відповіді:


115

Ось двоетапний процес, за допомогою якого можна перевірити, що маркер доступу користувача належить вашій програмі:

1) Створіть маркер доступу до додатка

( https://developers.facebook.com/docs/howtos/login/login-as-app/ )

https://graph.facebook.com/oauth/access_token?
client_id=YOUR_APP_ID
&client_secret=YOUR_APP_SECRET
&grant_type=client_credentials

2) Налагоджуйте маркер доступу користувача

( https://developers.facebook.com/docs/howtos/login/debugging-access-tokens/ )

https://graph.facebook.com/debug_token?
input_token=INPUT_TOKEN
&access_token=ACCESS_TOKEN

Де INPUT_TOKEN - це маркер доступу користувача, який ви хочете підтвердити, а ACCESS_TOKEN - маркер вашого додатка, який ви отримали з кроку 1.

Кінцева точка налагодження в основному скидає всю інформацію про маркер, тому він відповість приблизно так:

{
    data: {
        app_id: YOUR_APP_ID,
        is_valid: true,
        metadata: {
            sso: "iphone-safari"
        },
        application: YOUR_APP_NAMESPACE,
        user_id: USER_ID,
        issued_at: 1366236791,
        expires_at: 1371420791,
        scopes: [ ]
    }
}

Якщо цей маркер не з "вашого додатка", він поверне відповідь про помилку.


13
За даними Facebook , це правильний спосіб огляду жетонів. Однак перша частина є необов’язковою, оскільки ви можете використовувати ідентифікатор програми та секрет замість адміністратора чи маркера програми.
Брендон Захарі

@BrandonZacharie Не бачу, як ви це робите, я просто спробував ідентифікатор програми та секрет і дав мені помилку за "потрібний параметр input_token"
Johnny Z

@JohnnyZ вводиться маркер введення. Маркер доступу - це гнучкість.
Брендон Захарі

8
@BrandonZacharie Ви маєте рацію, я отримував заплутані символи для введення та доступу. Щоб використовувати ідентифікатор програми та секрет, я передав це як параметр, який містить "pipe" як роздільник: & access_token = APP_ID | APP_SECRET
Johnny Z


115

Оновлення: ця відповідь виглядає невпевнено, оскільки вона не підтверджує маркер спочатку як належний до вашої програми, дивіться коментарі, оригінальну відповідь наступним чином:

Я припускаю, що у вас уже є маркер доступу. У такому випадку найпростіший спосіб перевірити маркер доступу - надіслати наступний запит

https://graph.facebook.com/me?fields=id&access_token=@accesstoken

Тут замініть @accesstoken на ваш маркер доступу. Я буду розбивати URL і поясню кожен.

Ми видаємо тут запит графіку api, який повертає ідентифікатор користувача Facebook власника маркера доступу у вигляді рядка JSON. Ключове слово "я" відображає користувача, який зараз увійшов або власника маркера доступу. Для цього запиту маркер доступу є обов'язковим параметром.

Якщо наданий маркер доступу недійсний або термін дії якого закінчився, Facebook просто поверне повідомлення про помилку.

Для дійсного маркера доступу результат буде якось виглядати таким чином

{
   "id": "ID_VALUE"
}

14
Чи не вдалося б просити цей запит, якби той користувач надав access_token, який належить до іншого додатка?
Юрій Нємцов

2
Можна використовувати будь-який дійсний маркер доступу користувача (незалежно від того, якому додатку він належить)
Робін,

12
@Xiquid це повідомлення не є вирішенням проблеми, оскільки воно не підтверджує, чи маркер доступу належить вашій програмі.
Колюня

12
Я не розумію, чому ця відповідь має найбільше голосів! Це ОБОВ'ЯЗКОВО не правильне рішення. Власне, правильний підхід - це те, що запропонував "себастьян краб". Кінцева точка debug_token використовується для запиту інформації про сам маркер, і таким чином ви можете перевірити, що маркер належить конкретному ідентифікатору користувача для конкретного ідентифікатора програми!
Алекс Нтусіас

4
Так, ця відповідь не вірна. Якщо ви підтвердили маркер доступу таким чином, хтось може отримати маркер доступу з іншої програми та використовувати його для аутентифікації з вашим.
Джонатан

11

Іншим рішенням буде використання, https://graph.facebook.com/app/?access_token=[user_access_token]як описано в розділі Отримати ідентифікатор програми з маркера доступу користувача (або перевірити вихідний додаток на маркер) .

Це здається недокументованою функцією, але повертає JSON, що містить ідентифікатор програми, для якого був створений маркер. Якщо маркер не був для вашої програми, він повертає 400.


Як я можу отримати рейтинги іншого бізнесу у Facebook. Що мені потрібно для цього зробити?
Манееш Рао

6

В останній версії facebook (2.2) ви можете це зробити так:

https://developers.facebook.com/docs/graph-api/reference/v2.2/debug_token

Вибірка зразка:

{
    "data": {
        "app_id": "THE APP ID", 
        "application": "APP NAME", 
        "expires_at": 1427245200, 
        "is_valid": true, 
        "scopes": [
        "public_profile", 
        "basic_info", 
        "read_stream", 
        "email", 
        "publish_actions", 
        "read_friendlists", 
        "user_birthday", 
        "user_hometown", 
        "user_location", 
        "user_likes", 
        "user_photos", 
        "user_videos", 
        "user_friends", 
        "user_posts"
        ], 
        "user_id": "THE USER ID"
    }
}

Чи означає це, що вам потрібно буде викликати цю кінцеву точку fb при кожному запиті? Хіба не існує способу швидкої допомоги?
Jdruwe

Це працює, але для нього потрібен маркер доступу. Маркер доступу може бути створений за допомогою відповіді "sebastian the crab" або ми можемо просто використовувати appid | appsecret. Більше інформації Info developers.facebook.com/docs/facebook-login/…
krishnan

Ось приклад використання цього: stackoverflow.com/a/16947027/32453
rogerdpack

2
private function facebookRequestMe($access_token)
{
    include_once "facebook.php";

    $facebook = new Facebook(array(
        "appId" => "your_application_id",
        "secret" => "your_application_secret"
    ));
    $facebook->setAccessToken($access_token);
    return $facebook->api("/me", "GET");
}

Ви можете завантажити SDK Facebook для PHP від GitHub .


1

Якщо користувач передав вам UID Facebook, який він стверджує, є їхнім, і ви хочете перевірити, чи це він законний, це функція Python, яка перевірить його відповідно до свого маркера доступу (реалізація відповіді Робіна Джоме):

def verify_facebook_id(id, access_token):
    import requests
    import simplejson
    params = {'fields': 'id', 'access_token': access_token}
    text = requests.get("https://graph.facebook.com/me", params=params).text
    json = simplejson.loads(text)
    response_id = json["id"]
    return response_id == id

Це не підтверджує, що маркер створено "для вашого додатка" на жаль ...
rogerdpack

1

Це єдиний безпечний спосіб підтвердити маркер користувача, використовуючи лише один запит:

https://graph.facebook.com/debug_token?input_token={token-to-inspect}&access_token={app_id}|{app_secret}

Зауважте, що знак "|" у наведеній вище URL-адресі використовується не як АБО, а як роздільник, і він повинен бути там після заповнення інших полів.

Відповідь буде JSON виглядає так:

{
    data: {
        app_id: {app_id},
        application: {app_name},
        expires_at: {some_number},
        is_valid: {true|false}
        scopes: {array_of_permissions},
        user_id: {user_id}
    }
}

Довідка: https://developers.facebook.com/docs/facebook-login/access-tokens/#apptokens (вищевказаний метод згадується внизу цього розділу)


Існує ще один безпечний спосіб з одним проханням: stackoverflow.com/a/36555287/32453
rogerdpack

-1

Поряд із маркером доступу Facebook також надсилає параметр "expires_in", який є значенням зміщення. Використовуйте це для обчислення часу, коли маркер доступу закінчиться як NSDate. Потім, коли вам потрібно зробити запит, порівняйте поточну дату з датою закінчення терміну дії.

Також спробуйте перевірити коди статусу та рядки відповідей, які Facebook надсилає назад.

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