Получение идентификатора приложения из маркера доступа пользователя (или проверка исходного приложения на наличие маркера)
Я нашел это вопрос, который имеет ответ, но facebook изменил формат токена с тех пор, теперь это что-то вроде:
AAACEdEose0cBACgUMGMCRi9qVbqO3u7mdATQzg[more funny letters]ig8b3uss9WrhGZBYjr20rnJu263BAZDZD
короче говоря, вы ничего не можете сделать из этого. Я также нашел отладчик маркеров доступа, который показывает информацию, которую я ищу, если вы вставляете токен, что приятно, но не помогает мне сделать это программно.
точка, если кто-то получает маркер для пользователя, он может использовать его для доступа к график, который я делаю в своем приложении - я хочу быть уверен, что люди пересылают токен, который был выдан им моим приложением, а не другим.
мой поток приложения:
- получить маркер доступа от facebook (ничего особенного, в том, как это описано в здесь, поток на стороне сервера. (также iPhone и android и используется, но у них есть похожие потоки, если я правильно помню))
[устройство] [facebook] - С маркер доступа, устройство будет обращаться к моему серверу приложений с помощью маркера
[устройство] [приложение Джонатана]
На моем сервере я прикрепляю маркер доступа к пользователю и использую его для предоставления разрешений этому пользователю в моем приложении. (использование facebook connect для аутентификации пользователей)
Мое приложение защищено, и доступ к нему также аутентифицируется независимо от facebook, но! в этом потоке слабым звеном, которое я определил, является что я не могу аутентифицировать точно, что токен доступа, который я получил, был подписан для моего приложения - мне это не нравится, потому что я кэширую токены для автономного использования, я хочу быть на 100% уверен, что они для моего приложения, с моими разрешениями.
Итак, каков будет (лучший) способ аутентификации того, что токен, который я получил, связан с моим приложением (для отношения к пользователю я использую токен для доступа /me и вижу, для какого пользователя этот токен)
мне не нужно расшифровывать маркер (i угадайте его какой-то AES), я просто ищу конечную точку, которая скажет мне, что токен соответствует моему идентификатору приложения.
(EDIT: использование C# SDK, если это имеет значение.. Но вызов graph / rest, чтобы дать эту информацию, также хорош:))
4 ответа:
https://graph.facebook.com/app/?access_token=[user_access_token]
Это вернет приложение, для которого был создан этот токен, вы можете сравнить его с идентификатором вашего приложения.
официальная конечная точка графика для проверки маркеров доступа:
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:
проверка доступа жетоны: https://developers.facebook.com/docs/facebook-login/login-flow-for-web-no-jssdk/#checktoken
Приложение Жетоны: https://developers.facebook.com/docs/facebook-login/access-tokens/#apptokens
документированный способ убедиться, что это использовать
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/
Я сделал скриншот, так что время видно, и вы можете найти дополнительную информацию, если вы заинтересованы.