#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['Имя сессии']);, всё пользователь разлогинен!
Комментариев нет:
Отправить комментарий