7even/vkontakte_api

Клиентские токены больше не работают

Ajaxy opened this issue · 10 comments

Ajaxy commented

С 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

7even commented

заголовок с пользовательским IP

Можно вот об этом поподробнее? Как заголовок называется, описан ли в документации ВК?

Ajaxy commented

Я ошибочно предположил, что IP адрес отправляется вместе с другими HTTP-заголовками и, следовательно, его можно "подделать", но на самом деле он отправляется в заголовках на уровне самого протокола IP.

Со стороны HTTP есть заголовок X-Http-Forwarded-For, который служит как раз для подобных случаев: когда некий клиент-серверный запрос проксируется каким-либо промежуточным хостом. В нашем случае ситуация несколько другая, так как мы не напрямую проксируем запрос, а выполняем его "от имени клиента". Непонятно, как резолвится IP адрес в API VK, и учитывает ли он этот заголовок, но можно попробовать.

7even commented

Думаю, что IP клиента определяется на уровне веб-сервера VK.

Ajaxy commented

Это понятно, но непонятно учитывают ли они заголовок X-Http-Forwarded-For или смотрят напрямую в IP отправителя.

7even commented

учитывают ли они заголовок X-Http-Forwarded-For или смотрят напрямую в IP отправителя

Я об этом и говорю.

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

Ajaxy commented

Сейчас ситуация каким-то странным образом изменилась. Получаю на клиенте токен, делаю обращение с сервера к методу 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]}
Ajaxy commented

Оказывается проблема в параметре v=5.26, если его передать в curl --data "v=5.26", возвращается такая же ошибка.

Ajaxy commented

--header "X-Forwarded-For: YYYYY" не помогает.

7even commented

Очевидно, проблема в номере версии API.

Ajaxy commented

Проблема в том, что, начиная с определенной версии, клиентские токены на сервере не работают. По умолчанию используется устаревшая версия "3.0", в которой этот механизм еще работал. На самом деле он раньше работал и в "5.*", но это уже на совести VK API.