Страницы

Поиск по вопросам

вторник, 24 декабря 2019 г.

Регистрация и авторизация через VK API

#php #javascript #vkontakte_api #авторизация #соцсети


Пытаюсь реализовать регистрацию/авторизацию на своём сайте через соц. сеть. 
Не совсем понятен принцип работы и дальнейшая безопасность после авторизации. 

Изучил всё что тут написано: https://vk.com/dev/openapi

Создал приложение, добавил JS VK к себе, добавил тот скрипт, что там прописан. Соединение
проходит, возвращается ID, имя и т.д. (всё что запрошу). Но как мне записать что-нибудь
в БД, чтобы потом определить, что этот пользователь зарегистрирован/авторизован? Никакого
хэша, который я бы мог использовать в этих целях, не возвращается. 

Конечно, я могу после авторизации и получения ответа через JS, отправить AJAX-запрос
к себе на сервер с ответом, который вернул ВК, но как проверить со стороны сервера,
что авторизация прошла успешно и это не злоумышленник подсунул левый ID?

Хочется сделать именно асинхронную авторизацию, чтобы после клика на кнопку проверились
данные и прошла авторизация/регистрация, и при этом она была бы безопасной.



Смотрел серию уроков «PHP » Аутентификация через ВКонтакте» и читал другие темы по
этим вопросам, но, в основном, везде рассматривается синхронная авторизация, где пользователь
будет несколько раз перенаправлен на другие страницы сайта, а мне такой вариант не
подходит. Допускаю только одно обновление страницы пользователя: только тогда, когда
он уже авторизован/зарегистрирован. Всё остальное — в асинхронном режиме. 

Опять же, могу отправить ID пользователя к себе на сервер в свой скрипт, но как проверить
его? Ведь у меня не будет параметра code, как в примере по ссылке выше и, соответственно,
я не смогу отправить запрос для получения access_token.



Поправка: параметр code нашёл, а вот параметра redirect_uri — нет, и VK отвечает так:


  {"error":"invalid_grant","error_description":"Code
  is invalid or expired."}


Делаю запрос так:


  $params = array(
    'client_id' => 'тут ид моего приложения',
  
  'client_secret' => 'тут ключ моего приложения', 
  
  'code' => $_POST['user']['sid'], 
  
  'redirect_uri' => '');
  
  $token = json_decode(file_get_contents('https://oauth.vk.com/access_token' . '?'
. urldecode(http_build_query($params))), true);




Понял, что процедуры серверного получения code не избежать. Начал делать по этим
инструкциям: https://vk.com/dev/auth_sites 

Предварительно всё равно провожу клиентскую авторизацию и только при успехе отправляю
запрос на сервер, который затем отправляет запрос для получения переменной code, но
опять вылазит окно с требованием ввести логин/пароль VK (на этот раз его требует серверная
авторизация), а не нормальный ответ. В качестве redirect_uri указываю адрес вызываемого
AJAX-файла, надеясь, что сервер VK вернёт туда $_GET['code'], и следующем запросом
я смогу уже получить access_token...

Я так понимаю, окно с повторной авторизацией вылазит потому, что идёт проверка IP,
которые не совпадают. Как быть? 

Не понимаю, почему бы не сделать один и тот же code-ключ при клиентской авторизации
и при серверной, чтобы можно было связать воедино и добиться-таки доступа в одно обновление
страницы пользователя (с вылезающем окном VK, это ничего), но не 3-4 редиректа, как
предлагается при полностью серверной авторизации в документации. Или, может, что-то
делаю не так (что вероятнее).



Начал в PHP-файле делать так:


  if (!isset($_GET['code']))
  
  header('location:
  http://oauth.vk.com/authorize' . '?' .
  urldecode(http_build_query($params)));
  
  else echo $_GET['code'];


Теперь возвращается code при прямом открытии PHP-файла, а если он вызывается AJAX`ом,
то там, понятное дело, ошибка после редиректа:


  XMLHttpRequest cannot load
  http://oauth.vk.com/authorize...


Попытка использовать cURL или file_get_contents приводит к тому, что возвращается
форма авторизации ВК и начинает "скакать" в прямом смысле слова на экране. 

Эх :( Продолжаю разбираться. Может есть способ отправить запрос VK, но чтобы тот
не редиректил назад, а вернул только ответ? (без redirect_uri сразу возращает ошибку)



UPD

Разобрался почти со всем самостоятельно: пришлось отказаться от авторизации "в один
клик" и смириться с неизбежным — двумя редиректами сначала за code, а потом за access_token.
Теперь другая проблема — как разлогинить приложение у пользователя?

А то получается, после одного подтверждения пользователем всё сохраняется и больше
пользователя уже никто не спрашивает, разрешает ли он доступ сайта к данным, или нет.
С одной стороны — это удобно, но с другой — у пользователя ведь может быть несколько
учётных записей VK, или за одним компьютером могут сидеть несколько человек. 

Поэтому нужно дать возможность разлогинить приложение у пользователя, например, при
переходе по ссылке. Как я понял, это делается по ссылке

http://oauth.vk.com/logout?client_id=ид_приложения 

Но там ещё требует хэш, который непонятно откуда брать: в документации ни слова про
разлогин. Техподдержка вконтакте молчит. Может хоть тут помогут?
Я пытался по-всякому передавать туда и code-переменную из авторизации, и access_token
— толку нет, всё время:


  wrong logout hash

    


Ответы

Ответ 1



Сохраняете авторизацию в сессию, далее просто unlink($_SESSION['Имя сессии']);, всё пользователь разлогинен!

Комментариев нет:

Отправить комментарий