Задать вопрос

VK API — как проверить на стороне сервера access_token-а, полученного из standalone/mobile приложения?

Схема такая:
1. пользователь логинится в мобильном приложении через vk
2. получает access_token
3. передаёт его на сервер
4. на сервере происходит проверка этого access_token-а и получение id пользователя, соответствующего данному access_token (в FB аналог https://graph.facebook.com/me?access_token=...)
5. сервер автоматически регистрирует/логинит пользователя

Я пытаюсь использовать метод secure.checkToken:
1. vk.com/dev/auth_server - тут я получил access_token
2. делаю такой запрос:
https://api.vk.com/method/secure.checkToken?token=<user_access_token>&client_secret=<app_secret>&access_token=<access_token>

в ответ получаю:
{"error":{
     "error_code":15,"error_msg":"Access denied: Incorrect token sig_param",
     "request_params":[
          {"key":"oauth","value":"1"},
          {"key":"method","value":"secure.checkToken"},
          {"key":"token","value":"<user_access_token>"},
          {"key":"client_secret","value":"<app_secret>"},
          {"key":"access_token","value":"<access_token>"}
     ]
}}
  • Вопрос задан
  • 21161 просмотр
Подписаться 14 Сложный 2 комментария
Решения вопроса 1
В общем помучался пару часов и удалось решить путем добавления "offline" в scope. Привязка по IP не работает в таком случае.
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
Проверьте внимательно, что вы всё отправляете верно. Только что закончил задачу, похожую на вашу. Всё работает так, как написано в документации.
Сначала получаем access_token:
https://api.vk.com/oauth/access_token?v=5.21&client_id=<app_id>&client_secret=<app_secret>&grant_type=client_credentials

Получаем в ответ:
{access_token: <access_token>, expires_in: 0}
Затем выполняем запрос secure.checkToken:
https://api.vk.com/method/secure.checkToken?v=5.21&token=<user_token>&ip=<user_ip>&client_secret=<app_secret>&access_token=<access_token>

Получаем в ответ:
{response: {success: 1, user_id: <user_id>, date: 1400088413, expire: 1402680413}}


Дополнение: Я user_token получаю из flash_vars (access_token) из игрушки на флэше, а вы через мобильное приложение, возможно поэтому поведение отличается.
Ответ написан
Ребята, удалось найти решение? Я столкнулся с той же проблемой. На сервере есть таблица с пользователями, у каждого пользователя много способов входа. Соответственно, мой сервер создает для мобильных приложений authticket на основании идентификатора пользователя, полученного от приложения. Почту проверить просто (по паролю), Фейсбук тоже просто, а с ВК проблма из-за того, что access token привязан к IP. Какие есть идеи? Спасибо!
Ответ написан
Комментировать
@EduardTrayan
Cудя по этой документации ваш запрос должен иметь вид

https://api.vk.com/method/secure.checkToken?token=<your_token>
Ответ написан
@EduardTrayan

1. пользователь логинится в мобильном приложении через vk
2. получает access_token
3. передаёт его на сервер


Если вы логините юзера через мобильное приложение, то получается судя опять таки по этому мануалу вам в строке запроса приходит токен и айдишка пользователя, те по сути эти действия
я пытаюсь использовать метод secure.checkToken:
вам не нужны

А вообще опишите что вы хотите сдеалть
Ответ написан
Плохая затея.. Токен не работает так как запрошен с одного ип/софт а проверяется с другого..
Вместо secure.checkToken вызывайте другой метод, например получение инфо о юзере или напишите свой метод через execute который будет делать проверку.. Но имейте ввиду, так как вы обращаетесь к апи с другого места, вк от вас запросит капчу.
Ответ написан
Lovesuper
@Lovesuper
pyhon, java, swift программист
На 2020ый год рабочая схема выглядит так:

https://api.vk.com/method/secure.checkToken?access_token=1581a9cd3481a9cd3481a9cd5534f00ff2334820481a9cd7a2e43ba39c6842ab16f8e65&client_secret=rtJbebd5vbAStnJyKwjA&v=5.21&client_id=7448000&token=8b31f3f6602885d6f479af9aab7cb7fe7c1a0487a47c64a7ef5e83daa23fe3001bbd5e9cc0c2967cef619


(в админке Вашего приложения надо взять айди приложения, аксес токен приложения и секрет приложения)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы