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

Рейтинг: 5Ответов: 1Опубликовано: 19.02.2015

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

Изучил всё что тут написано: 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

Ответы

▲ 5

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