Получить идентификатор приложения из токена доступа пользователя (или проверить исходное приложение для токена)

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

AAACEdEose0cBACgUMGMCRi9qVbqO3u7mdATQzg[more funny letters]ig8b3uss9WrhGZBYjr20rnJu263BAZDZD 

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

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

Мой stream приложений:

  1. Получите токен доступа из facebook (ничего особенного, как описано здесь , «Серверный stream» (также iPhone и Android), но они имеют похожие streamи, если я правильно помню))
    [устройство] [facebook]
  2. С помощью этого токена доступа устройство получит доступ к моему серверу приложений с токеном
    [device] [приложение Джонатана]
    На моем сервере я прикрепляю токен доступа к пользователю и использую его для предоставления разрешений этому пользователю в моем приложении. (с помощью подключения facebook для аутентификации пользователей)

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

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

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

(EDIT: использование C # SDK, если это имеет значение. Но вызов графика / restа, чтобы дать эту информацию так же хорошо, как хорошо :))

https://graph.facebook.com/app/?access_token=%5Buser_access_token%5D

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

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

 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 app_token_or_admin_token :

 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:

Документированный способ обеспечить это – использовать 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); 

Почему бы не использовать официальный способ делать что-то? Вот запрос из собственного видео 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

  • Проверка подлинности Google
  • Как OAuth 2 отличается от OAuth 1?
  • Какова цель неявного типа авторизации гранта в OAuth 2?
  • Почему API календаря Google (oauth2) отвечает «Недостаточное разрешение»?
  • Как получить отпечаток сертификата подписчика (SHA1) для OAuth 2.0 на Android?
  • Доступ к API Google - GoogleAccountCredential.usingOAuth2 vs GoogleAuthUtil.getToken ()
  • OAuth2 и API Google: срок действия токена доступа?
  • Ошибка: поле заголовка запроса Content-Type недопустимо по заголовкам Access-Control-Allow-Headers
  • Как обновить токен доступа с помощью токена обновления?
  • Поддерживает ли OpenID Connect учетные данные пароля владельца ресурса?
  • Регистрация внешних интерфейсов Web API 2 из нескольких клиентов API с идентификацией OWIN
  • Interesting Posts

    Как заставить RelativeLayout работать с объединением и включать?

    Как установить Visual Studio 2010 Express где-нибудь, кроме C :?

    В Java, как мне вызвать метод базового classа из переопределяющего метода в производном classе?

    ОШИБКА 1044 (42000): доступ запрещен для «root» со всеми привилегиями

    Как добавить привязку к событию инициализации контекста приложения?

    В чем разница между $ routeProvider и $ stateProvider?

    Что эквивалентно ActionBar в более ранних версиях sdk?

    Как использовать 32-разрядные собственные библиотеки на 64-битном Android-устройстве

    Где находится папка обоев в Windows 7?

    Условно начать в разных местах в раскадровке из AppDelegate

    jquery check отметьте все флажки с помощью кнопки

    C – методы сериализации

    MongoDB: Можно ли сделать запрос без учета регистра?

    Импорт android.support не может быть разрешен

    Не найден ресурс, который соответствует указанному имени ‘@ style / Theme.AppCompat.Light’

    Давайте будем гением компьютера.