Клиентские токены больше не работают
Ajaxy opened this issue · 10 comments
С 6 июня VK проверяет IP адрес при запросах с указанием токена, полученного извне (например, через клиенский OAuth или тот, что передаётся в IFrame).
Возвращается ошибка: "error_code":5,"error_msg":"User authorization failed: access_token was given to another ip address."
Нужно либо добавить возможность передать заголовок с пользовательским IP, либо поддержать этот метод: https://vk.com/pages?oid=-1&p=%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BE%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5_%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81_API
заголовок с пользовательским IP
Можно вот об этом поподробнее? Как заголовок называется, описан ли в документации ВК?
Я ошибочно предположил, что IP адрес отправляется вместе с другими HTTP-заголовками и, следовательно, его можно "подделать", но на самом деле он отправляется в заголовках на уровне самого протокола IP.
Со стороны HTTP есть заголовок X-Http-Forwarded-For
, который служит как раз для подобных случаев: когда некий клиент-серверный запрос проксируется каким-либо промежуточным хостом. В нашем случае ситуация несколько другая, так как мы не напрямую проксируем запрос, а выполняем его "от имени клиента". Непонятно, как резолвится IP адрес в API VK, и учитывает ли он этот заголовок, но можно попробовать.
Думаю, что IP клиента определяется на уровне веб-сервера VK.
Это понятно, но непонятно учитывают ли они заголовок X-Http-Forwarded-For
или смотрят напрямую в IP отправителя.
учитывают ли они заголовок X-Http-Forwarded-For или смотрят напрямую в IP отправителя
Я об этом и говорю.
Можно попробовать добавить этот заголовок, но сейчас у меня нет времени этим заниматься.
Сейчас ситуация каким-то странным образом изменилась. Получаю на клиенте токен, делаю обращение с сервера к методу friends.getAppUsers
. Через curl
работает, через этот джем — нет:
irb(main):010:0> vk = VkontakteApi::Client.new('XXXXX')
=> #<VkontakteApi::Client:0x0055e177302c90 @token="XXXXX">
irb(main):011:0> vk.friends.get_app_users
D, [2016-02-25T11:48:01.793543 #4102] DEBUG -- : POST https://api.vk.com/method/friends.getAppUsers?access_token=XXXXX
D, [2016-02-25T11:48:01.793983 #4102] DEBUG -- : body: "v=5.26"
W, [2016-02-25T11:48:02.081998 #4102] WARN -- : {"error":{"error_code":17,"error_msg":"Validation required: please open redirect_uri in browser 875928265","request_params":[{"key":"oauth","value":"1"},{"key":"method","value":"friends.getAppUsers"},{"key":"v","value":"5.26"}],"redirect_uri":"https:\/\/m.vk.com\/login?act=security_check&api_hash=178fb370254d221c56"}}
VkontakteApi::Error: VkontakteApi::Error
$ curl https://api.vk.com/method/friends.getAppUsers?access_token=XXXXX
{"response":[121336,432487,929361,9109382,60865777]}
Оказывается проблема в параметре v=5.26
, если его передать в curl --data "v=5.26"
, возвращается такая же ошибка.
--header "X-Forwarded-For: YYYYY"
не помогает.
Очевидно, проблема в номере версии API.
Проблема в том, что, начиная с определенной версии, клиентские токены на сервере не работают. По умолчанию используется устаревшая версия "3.0", в которой этот механизм еще работал. На самом деле он раньше работал и в "5.*", но это уже на совести VK API.