Ответ 1
Да. Вы можете запросить это:
https://graph.facebook.com/app?access_token=TOKEN
Он вернет имя, идентификатор и несколько характеристик приложения, которые создали токен доступа.
Мне нужно проверить, что пользователи моего iPhone-приложения действительно вошли в мое приложение Facebook. Я могу проверить их идентификатор пользователя, извлекая его с помощью токена доступа:
https://graph.facebook.com/me?fields=id&access_token=XXXXXXXXXXXXXXX
Проблема безопасности, которую я предвижу, заключается в том, что они могут отправить мне любой действительный токен доступа, и он вернет свой идентификатор пользователя. Мне нужно также проверить этот токен для моего конкретного приложения. Есть ли способ вернуть идентификатор приложения в этом запросе, чтобы подтвердить это?
Да. Вы можете запросить это:
https://graph.facebook.com/app?access_token=TOKEN
Он вернет имя, идентификатор и несколько характеристик приложения, которые создали токен доступа.
Facebook теперь обеспечивает поддержку отладки токена доступа. Вы можете получить информацию, относящуюся к определенному токену доступа, отправив запрос GET в соединение debug_token
. Что-то вроде:
GET /debug_token?
input_token={input-token}&
access_token={access-token}
Где, входной токен: токен доступа, который вы хотите получить, и токен доступа: токен доступа к вашему приложению или действительный токен доступа пользователя из разработчик приложения
И это вернет следующую информацию:
{
"data": {
"app_id": 000000000000000,
"application": "Social Cafe",
"expires_at": 1352419328,
"is_valid": true,
"issued_at": 1347235328,
"scopes": [
"email",
"publish_actions"
],
"user_id": 1207059
}
}
Вы можете получить дополнительную информацию об этом в Справка о знаках и отладки.
Вот моя реализация в Python 3, реализующая один пакетный запрос Facebook. Это должно дать вам как данные APP, так и USER, привязанные к пользователю access_token за один вызов.
#Build the batch, and urlencode it
batchRequest = '[{"method":"GET","relative_url":"me"}, {"method":"GET","relative_url":"app"}]'
batchRequestEncoded = urllib.parse.quote_plus(batchRequest)
#Prepare the batch and access_token params
dataParams = 'access_token=%s&batch=%s' % (fb_access_token, batchRequestEncoded)
dataParamsEncoded = dataParams.encode()
fbURL = 'https://graph.facebook.com/'
#This will POST the request
response = urllib.request.urlopen(fbURL, dataParamsEncoded)
#Get the results
data = response.read()
data = json.loads(data.decode("utf-8"))
Вероятно, существует более питонический способ реализовать некоторые из вызовов кодирования, которые я написал, но я просто хотел показать, что именно сработало для меня.
Вы можете использовать appsecret_proof
в своих вызовах api.
В официальной документации :
Ленты доступа переносимы. Возможно использовать токен доступа созданный на клиенте с помощью SDK от Facebook, отправить его на сервер, а затем совершать вызовы с этого сервера от имени клиента.
Это можно предотвратить, добавив параметр appsecret_proof к каждому API-вызов с сервера и включение параметра, требующего подтверждения на все звонки. Это мешает плохим парням совершать вызовы API с помощью токены доступа со своих серверов.
Пример:
https://graph.facebook.com/app?access_token=TOKEN&appsecret_proof=<app secret proof>
В PHP:
$endpoint = sprintf(
'https://graph.facebook.com/app?access_token=%s&appsecret_proof=%s',
urlencode($accessToken),
urlencode(
hash_hmac('sha256', $accessToken, $appSecret)
)
);
Теперь вы можете доверять тому, что полученный ответ можно использовать для аутентификации.