Авторизация с помощью API паспорта Яндекса облегчает вход, авторизацию пользователям вашего сайта. Не требуется вводить логин, пароль, капчу при авторизации, и вообще не нужна регистрация на сайте. На текущей странице моего блога реализован этот механизм. Если вы уже авторизованы на Яндексе, то чтобы войти на сайт, например для написания комментария, потребуется только один клик по значку «Яндекс вход». Если не выполнен вход в аккаунт (учетную запись) Яндекса, то потребуется 3, 4 клика, в зависимости от количества аккаунтов в Яндексе.
Порядок входа
Если посетитель этого блога не авторизован на ресурсе поисковика Яши, то после клика по значку входа механизм получения доступа следующий:
- откроется страница passport.yandex.ru для выбора аккаунтов входа,
- после произведенного выбора появится окно для ввода пароля,
- остается ввести пароль аккаунта яндекса и нажать «войти».
В случае наличия единственного аккаунта у поисковика Яши кликов на один шаг меньше, т.е. только 3. Такой порядок входа значительно уменьшает количество движений у юзера.
Для начала получения этого сервиса на нужных страницах сайта устанавливается ссылка входа.
После клика она отправляет посетителя на OAuth-сервер и имеет следующий вид:
<a href="https://oauth.yandex.ru/authorize?response_type=code&client_id=<ID_ПРИЛОЖЕНИЯ>></a>
Про <ID_ПРИЛОЖЕНИЯ> написано в этой статье ниже. Угловые скобки и то что внутри скобок необходимо заменить конкретным значением.
Реализация входа через Яндекс на этом блоге
На OAuth-сервере API паспорта использует протокол OAuth 2.0. Подробности в документации yandex.ru/dev/oauth/doc/dg/concepts/about.html. После пройденных шагов по регистрации сайта, получению доступов вернутся ID ПРИЛОЖЕНИЯ и ПАРОЛЬ ПРИЛОЖЕНИЯ, которые и надо реализовать в скрипте для получения токена, а далее и защищенных данных пользователя.
У меня это реализовано в файле yandex.php. Скрипт этого файла отправляется на OAuth-сервер Яндекса POST-запросом. Там он обрабатывается и этот же файл yandex.php примет результат обработки.
Отправляем POST-запрос на адрес «oauth.yandex.ru» и получаем результат с помощью CURL.
Коротко о CURL
Расширение CURL (Client URL Library) обеспечивает широкие средства управления сетевыми операциями компактным способом. Позволяет взаимодействовать с серверами по различным протоколам с синтаксисом URL. Эта библиотека функций предоставляет возможность посылать запросы из PHP скрипта методами POST, GET, PUT.
Начиная с версии v1803 операционной системы Windows 10, служебная программа уже установлена и настроена. Её наличие проверяется вводом команды “curl -help“ в командную строку. Если ошибок нет, то можно пользоваться curl-ом. Для того чтобы функции библиотеки CURL были доступны из PHP-скрипта, в конфигурационном файле php.ini необходимо подключить расширение php_curl.dll, сняв комментарий (точка с запятой ;) с директивы extension.
Подробное комментирование входа в файле yandex.php
OAuth-сервер Яши производит редирект на адрес Callback URI, указанный нами при регистрации сайта. В моем случае на файл yandex.php. При этом к адресу добавляется параметр code (‘code’ - <код_подтверждения>). Наличие его проверяется в самом начале PHP скрипта yandex.php, а затем этот код ($_GET['code']) используется функцией для получения нашего токена.
Начинаем новый сеанс cURL функцией curl_init(), возвращающей дескриптор $curl, который используется последующими функциями.
Функция curl_setopt() позволяет задать параметры текущего соединения. Константа CURLOPT_URL, в качестве параметра функции, описывает URL, с которым будет производиться операция. Задаем полный адрес удаленного сервера, именно полный – с префиксом https://, так как расширение CURL работает с несколькими видами протоколов. Нашему скрипту необходимо выполнить POST-запрос на https://oauth.yandex.ru/token.
Туда передаем параметры. Для этого в функции curl_setopt() используется константа CURLOPT_POSTFIELDS (данные, передаваемые в HTTP POST-запросе). Её значение - 'grant_type=authorization_code&code='.$_GET['code'].'&client_id=<ID_ПРИЛОЖЕНИЯ>&client_secret=< ПАРОЛЬ_ПРИЛОЖЕНИЯ>'.
ID и ПАРОЛЬ ПРИЛОЖЕНИЯ – из зарегистрированного на OAuth-сервере нашего сайта. Их нам сгенерировал и затем предоставил Яша после регистрации сайта.
Подобным образом устанавливаем параметры о том, что результат надо возвратить, у удаленного сервера сертификат не проверять.
После установки всех необходимых параметров при помощи функции curl_exec($curl) выполняется запрос к удаленному серверу, и затем производим декодирование полученной JSON строки в переменную PHP $token.
Ключ [‘access_token’] массива $token как раз и содержит значение нашего искомого OAuth-токен.
Завершаем сеанс cURL функцией curl_close().
Токен от Яндекса
Далее работаем со значением ключа [‘access_token’]. Это и есть токен (Что такое токен), предоставляющий доступ к защищённым данным пользователя, который на нашем сайте выполнил вход для авторизации через Яндекс без необходимости передачи логина и пароля.
OAuth-токен требуется указывать при выполнении запроса к API. Информация о пользователе, о приложении заложена в токене. Токен информирует, от какого приложения (в нашем случае – сайта), от какого пользователя выполняется запрос, разрешил ли пользователь этому сайту доступ к своим данным в Паспорте, имеет ли пользователь полномочия для обращения к этим материалам.
Для каждого пользователя отправляется свой отдельный токен.
Таким образом, для работы с API Паспорта нет необходимости отправлять пароль пользователя, достаточно отправить его OAuth-токен.
Нельзя никому сообщать значение токена, или давать возможность его получения. С его помощью злоумышленник получает доступ к секретным материалам юзера.
Работа с данными
Теперь в переменную $data, используя ключ [‘access_token’] массива $token, возвращаем ассоциативный массив с материалами о пользователе.
Потребуется обратиться к документации на странице yandex.ru/dev/passport/doc/dg/reference/response.html, чтобы расшифровать формат ответа и выяснить, как извлечь имя, логин, адрес почты, аватарку и т.п. пользователя.
Требуемые для дальнейшей работы данные сохраняем в сессию. Эти данные потребуются для ввода в скрипты на страницах сайта.
Редирект на страницы блога
Прошу обратить внимание, что API позволяет в URL, указанный при регистрации приложения, как Callback URL, добавлять после символа # некоторые данные о токене. Именно на этот URL Яндекс.Oauth перенаправляет пользователя после обработки токена. После # можно добавить параметр ‘state’ со значением строки. Это значение в адресной строке возвращается без изменения. Я его ($_GET['state']) использую для редиректа с помощью заголовка Location, перенаправляя посетителя блога на конкретное место страницы, откуда он произвел авторизацию через Яндекс. Это улучшает юзабилите настоящего блога. Осуществляется путем установки якоря.
Ссылка редиректа содержит элемент указателя $_SESSION['ya']. Значение его необходимо записывать в сессию на страницах сайта следующим образом:
<?php
session_start();
$_SESSION['ya'] = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
?>
Такой редирект работает надежно.
Итог
Вот и все. Скрипт авторизации через Яндекс небольшой, а комментарий получился обширный. Итог файла со скриптом авторизации используется в методах классов, функциях блога начинающего программиста, реализующих вход на сайт.
Описанный способ авторизации предоставляет преимущества не только посетителям ресурса, но и облегчает работу разработчику как готовая и бесплатная технология.