Проверьте токен доступа к Facebook для определенного приложения

Мне нужно проверить, что пользователи моего iPhone-приложения действительно вошли в мое приложение Facebook. Я могу проверить их идентификатор пользователя, извлекая его с помощью токена доступа:

https://graph.facebook.com/me?fields=id&access_token=XXXXXXXXXXXXXXX

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

Ответ 1

Да. Вы можете запросить это:

https://graph.facebook.com/app?access_token=TOKEN

Он вернет имя, идентификатор и несколько характеристик приложения, которые создали токен доступа.

Ответ 2

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
        }
    }

Вы можете получить дополнительную информацию об этом в Справка о знаках и отладки.

Ответ 3

Вот моя реализация в 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"))

Вероятно, существует более питонический способ реализовать некоторые из вызовов кодирования, которые я написал, но я просто хотел показать, что именно сработало для меня.

Ответ 4

Вы можете использовать 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)
    )
);

Теперь вы можете доверять тому, что полученный ответ можно использовать для аутентификации.