Получить идентификатор приложения из токена доступа пользователя (или проверить исходное приложение для токена) - PullRequest
58 голосов
/ 15 ноября 2011

Я нашел этот вопрос , в котором есть ответ, но Facebook изменил формат токена с тех пор, теперь это что-то вроде:

AAACEdEose0cBACgUMGMCRi9qVbqO3u7mdATQzg[more funny letters]ig8b3uss9WrhGZBYjr20rnJu263BAZDZD

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

ТочкаЕсли кто-то получает токен для пользователя, он может использовать его для доступа к графику, что я и делаю в своем приложении - я хочу быть уверен, что люди перенаправляют токен, выданный им моим приложением, а недругой.

Мой поток приложений:

  1. Получить токен доступа из Facebook (ничего особенного, как описано в здесь , Поток на стороне сервера. (тоже айфон и андроид и б / у, но у них похожие потоки если я правильно помню))[устройство] <-> [facebook]
  2. С этим токеном доступа устройство получит доступ к моему серверу приложений с токеном.[устройство] <-> [приложение Джонатана]На своем сервере я прикрепляю токен доступа к пользователю и использую его для предоставления разрешений этому пользователю в моем приложении.(используя Facebook Connect для аутентификации пользователей)

Мое приложение защищено, и доступ также аутентифицирован независимо от Facebook, НО!В этом потоке слабое звено, которое я обнаружил, состоит в том, что я не могу точно подтвердить подлинность того, что полученный мной токен был подписан для моего приложения - мне это не нравится, потому что я кеширую токены для автономного использования, я хочу быть уверен на 100%они для моего приложения, с моими разрешениями.

Итак, каков будет (лучший) способ аутентификации того, что полученный мной токен связан с моим приложением (для связи с пользователем я использую токен для доступа к / me и вижу, для какого пользователя этот токен)

Мне не нужно расшифровывать токен (я полагаю, что это какой-то AES), я просто ищу конечную точку, которая сообщит мне, что токен соответствует идентификатору моего приложения.

(РЕДАКТИРОВАТЬ: Использование C # SDK, если это имеет значение. Но вызов graph / rest для предоставления этой информации также хорош :))

Ответы [ 4 ]

60 голосов
/ 04 января 2012

https://graph.facebook.com/app/?access_token=[user_access_token]

Это вернет приложение, для которого был сгенерирован токен, вы можете сравнить его с идентификатором вашего приложения.

24 голосов
/ 05 июня 2013

Официальная конечная точка графа для проверки токенов доступа:

GET graph.facebook.com/debug_token?
      input_token=[user_access_token]&
      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
    }
}

app_token_or_admin_token можно получить с помощью вызова API Graph:

GET graph.facebook.com/oauth/access_token?
     client_id={app-id}
    &client_secret={app-secret}
    &grant_type=client_credentials

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

Соответствующая документация facebook:

5 голосов
/ 11 апреля 2016

Документированный способ обеспечить это - использовать appsecret_proof.

GET graph.facebook.com/v2.5/me?access_token=[TOKEN]&appsecret_proof=[PROOF]

Это подтверждает не только то, что это действительный токен, но также и то, что токен принадлежит приложению. Он также получает данные пользователя за один раз.

Вы можете получить PROOF выше в C #, используя это (от здесь ):

public static string ComputeHmacSha256Hash(string valueToHash, string key)
{
    byte[] keyBytes = Encoding.ASCII.GetBytes(key); 
    byte[] valueBytes = Encoding.ASCII.GetBytes(valueToHash);
    byte[] tokenBytes = new HMACSHA256(keyBytes).ComputeHash(valueBytes);
    valueBytes = null;
    keyBytes = null; 

    StringBuilder token = new StringBuilder();
    foreach (byte b in tokenBytes)
    {
        token.AppendFormat("{0:x2}", b);
    }
    tokenBytes = null; 

    return token.ToString();
}

ComputeHmacSha256Hash(accessToken, appSecret);
4 голосов
/ 06 марта 2017

Почему бы не использовать официальный способ ведения дел?Вот запрос из собственного видео FB о безопасности.

Запрос: https://graph.facebook.com/debug_token?input_token={token-to-check}&access_token={app_id}|{app_secret}

Ответ: "data": { "app_id": {token-app-id}, "user_id": {token-user-id}, ... }

Ссылка на официальное видео: https://www.facebook.com/FacebookforDevelopers/videos/10152795636318553/

Я сделал скриншот, чтобы время было видно, и вы можете найти больше информации, если вам интересно.

Facebook video screenshot

...