Получить идентификатор приложения из токена доступа пользователя (или проверить исходное приложение для токена)
Я нашел этот вопрос, на который есть ответ, но Facebook изменил формат токена с тех пор, теперь это что-то вроде:
AAACEdEose0cBACgUMGMCRi9qVbqO3u7mdATQzg[more funny letters]ig8b3uss9WrhGZBYjr20rnJu263BAZDZD
Короче говоря, вы ничего не можете сделать из этого. Я также нашел отладчик токенов доступа, который показывает информацию, которую я ищу, если вы вставляете токен, что приятно, но не помогает мне сделать это программно.
Дело в том, что если кто-то получает токен для пользователя, он может использовать его для доступа к графику, что я и делаю в своем приложении - я хочу быть уверен, что люди перенаправляют токен, который был им выдан моим приложением, и не другое.
Мой поток приложений:
- Получить токен доступа из Facebook (ничего особенного, в том виде, в котором он описан здесь, "Поток на стороне сервера" (также iPhone и Android и используются, но они имеют схожие потоки, если я правильно помню))
[устройство] <-> [facebook] - С этим токеном устройство получит доступ к моему серверу приложений с токеном.
[устройство] <-> [приложение Джонатана]
На своем сервере я прикрепляю токен доступа к пользователю и использую его для предоставления разрешений этому пользователю в моем приложении. (используя Facebook Connect для аутентификации пользователей)
Мое приложение защищено, и доступ также аутентифицирован независимо от Facebook, НО! В этом потоке слабое звено, которое я обнаружил, заключается в том, что я не могу точно подтвердить подлинность того, что полученный мной токен был подписан для моего приложения - мне это не нравится, потому что я кеширую токены для автономного использования, я хочу быть уверен на 100% они для моего заявления, с моими разрешениями.
Итак, каков будет (лучший) способ проверки подлинности того, что полученный мной токен связан с моим приложением (для связи с пользователем я использую токен для доступа к /me и вижу, для какого пользователя предназначен этот токен)
Мне не нужно расшифровывать токен (я думаю, это своего рода AES), я просто ищу конечную точку, которая сообщит мне, что токен соответствует моему идентификатору приложения.
(РЕДАКТИРОВАТЬ: Использование 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.
Соответствующая документация на фейсбуке:
Проверка токенов доступа: https://developers.facebook.com/docs/facebook-login/login-flow-for-web-no-jssdk/
Токены приложений: https://developers.facebook.com/docs/facebook-login/access-tokens/
Документированный способ убедиться, что это использовать 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/
Я сделал скриншот, чтобы время было видно, и вы можете найти больше информации, если вам интересно.