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

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

В принципе, я думаю, что он должен работать следующим образом:

  • В моем приложении iPhone пользователь входит в Facebook, используя свой адрес электронной почты и пароль.
  • Пользователь разрешает доступ к своим данным для связанных приложений Facebook.
  • Мое приложение iPhone получает токен доступа после успешного входа в систему.
  • При дальнейшей связи с моим сервером мое приложение iPhone должно использовать полученный токен доступа Facebook (например: в запросах).
  • Когда мой сервер получает запрос от приложения iPhone с токеном доступа, он должен спросить Facebook, что этот токен действителен (и для кого), и если да, сервер должен предположить, что пользователь аутентифицирован с помощью Facebook.

Мой вопрос: как сервер должен спрашивать Facebook, если данный токен доступа действителен? Я думаю, мне нужно как-то проверить, действительно ли токен действителен для моего приложения Facebook.

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

Ответ 1

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

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

https://graph.facebook.com/me?fields=id&[email protected]

Здесь замените @accesstoken доступным токеном доступа. Я сломаю URL и объясню каждый.

Здесь мы выписываем запрос api graph, который вернет идентификатор пользователя Facebook владельца токена доступа в виде строки JSON. Ключевое слово 'me' представляет собой зарегистрированного пользователя или владельца токена доступа. Для этого запроса токен доступа является обязательным параметром.

Если предоставленный токен доступа недействителен или истек, Facebook просто вернет сообщение об ошибке.

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

{
   "id": "ID_VALUE"
}

Ответ 2

Здесь двухэтапный процесс, который вы можете использовать для проверки того, что токен доступа пользователя принадлежит вашему приложению:

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: [ ]
    }
}

Если этот токен не из "вашего приложения", он возвращает ответ об ошибке.

Ответ 3

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

Это, как представляется, недокументированная функция, но возвращает JSON, содержащий идентификатор приложения, для которого был создан токен. Если токен не для вашего приложения, он возвращает 400.

Ответ 4

В последней версии 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"
    }
}

Ответ 5

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 для PHP из GitHub.

Ответ 6

Если пользователь передал вам идентификатор 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

Ответ 7

Это единственный защищенный метод проверки токена пользователя, используя только один запрос:

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

Обратите внимание, что знак "|" в указанном выше URL-адресе не используется как OR, а как разделитель и должен быть там после заполнения других полей.

Ответ будет выглядеть как 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 (выше метод указан в нижней части этого раздела)

Ответ 8

Вместе с токеном доступа Facebook также отправляет параметр "expires_in", который является значением смещения. Используйте это, чтобы вычислить, когда токен доступа истечет как NSDate. Затем, когда вам нужно выполнить запрос, сравните текущую дату с датой истечения срока действия.

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