ВСЕ СТАТЬИ
Блог начинающего программиста
Регистрация

Вход через Яндекс в файле PHP, использующем CURL с получением токена

Опубликовано:

Авторизация с помощью 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 примет результат обработки.


<?php /*авторизация через Яндекс*/
 if (!$_GET['code']) {exit('error code');}
 session_start();
 //Инициализируем сеанс
 $curl = curl_init();
 //Устанавливаем адрес для подключения
 curl_setopt($curl, CURLOPT_URL, 'https://oauth.yandex​.ru/token');
 //Указываем, что мы будем вызывать методом POST
 curl_setopt($curl, CURLOPT_POST, 1);
 //Передаем параметры методом POST
curl_setopt($curl, CURLOPT_POSTFIELDS, 'grant_type=authorization_code&code='.$_GET['code'].'&client_id=<ID_ПРИЛОЖЕНИЯ>&client_secret=<ПАРОЛЬ_ПРИЛОЖЕНИЯ>');
 //Говорим, что надо возвратить результат
 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
 //Запрещаем проверку сертификата удаленного сервера
 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
 //Декодируем строку JSON в переменную PHP
 $token = json_decode(curl_exec($curl), true);
 //Закрываем CURL-соединение
 curl_close($curl);
 //Получаем данные пользователя
 $data = json_decode(file_get_contents('https://login.yandex​.ru/info?oauth_token='.$token['access_token']), true);
 //Сохраняем их в сессию
$_SESSION["name_ya"] = $data["real_name"]; $_SESSION['login_ya'] = $data["login"]; $_SESSION['email_ya'] = $data["emails"][0]; $_SESSION["avatar_id"] = $data["default_avatar_id"]; $_SESSION["avatar_empty"] = $data["is_avatar_empty"]; //Редирект на последнюю страницу if(isset($_GET['state'])) { $link = 'http://' . $_SESSION['ya'] . '#newComment'; } else $link = 'http://' . $_SESSION['ya']; header("Location: $link"); exit(); ?>

Отправляем 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'];
?>
        

Такой редирект работает надежно.

Итог

Вот и все. Скрипт авторизации через Яндекс небольшой, а комментарий получился обширный. Итог файла со скриптом авторизации используется в методах классов, функциях блога начинающего программиста, реализующих вход на сайт.

Описанный способ авторизации предоставляет преимущества не только посетителям ресурса, но и облегчает работу разработчику как готовая и бесплатная технология.

Комментарии

Аватар пользователя: Администратор

Логотип и дизайн входа на сайт и сервисы с Яндекс ID уже не актуальны — пора их обновить!

В статье выше рассказано о реализации входа с помощью CURL. Теперь Яндекс рекомендует использовать Скрипт sdk-suggest.js

Сделать это просто:

  1. Выберите удобный способ авторизации.

    Виджет «Мгновенного входа» с именем и аватаркой пользователя — всплывает при входе и помогает повысить конверсию.

    Персональная кнопка или кнопка-иконка с логотипом Яндекса — можно адаптировать под свой стиль.

  2. Настройте с помощью JS-скрипта — с ним все будущие изменения будут встраиваться автоматически.

Вот и всё!

С этой задачей легко справится технический специалист, но если возникнут вопросы, можно написать в поддержку Яндекса.

Чтобы настроить мгновенный вход, выполните следующие шаги:

  1. Подготовьте на сайте страницу, на которой будет размещён саджест авторизации (мгновенный вход). Он подскажет посетителям, что можно войти с Яндекс ID. Это замечательно подойдет для сайтов без обязательной регистрации и личного кабинета.
  2. Подготовьте страницу, которая будет принимать OAuth-токен. Страница будет отображаться несколько миллисекунд, поэтому можно оставить белый экран.
  3. Зарегистрируйте OAuth-приложение в личном кабинете. Если уже сделали это, перейдите к следующему шагу.
  4. В зарегистрированном OAuth-приложении перейдите в раздел «Платформы», а затем — в «Веб-сервисы». Там добавьте в список Callback URL (страница, на которую пользователь попадёт после авторизации) ссылку на страницу из пункта 2.
  5. Добавьте sdk-код на страницу с саджестом и страницу, принимающую OAuth-токен.
  6. Настройте саджест в iframe.

Яндекс отмечает, что саджест не будет работать у пользователя, если он:

  • Запретил открытие iframe.
  • Полностью отключил или блокирует cookie. Для работы с саджестом у пользователя должны храниться cookie Яндекса.
  • Отключил поддержку JavaScript в браузере.
Аватар пользователя: manager

Теперь россиянам опасно авторизоваться через сервис яндекса. Основной и единственный владелец Яши - нидерландская компания Yandex N V. Это юридическое лицо зарегистрировано в Нидерландах - недружественной стране, воюющей против России (поставляет вооружение и боевиков вооруженным силам Украины).

Яндекс ежегодно отправляет 300 млн. руб налогов в бюджет Нидерландов.

Аватар пользователя: Администратор

Ну хотя бы 50 млр остается для бюджета России.

Аватар пользователя: astor-piazzolla

Здравствуйте. У меня сложилось впечатление, что документация противоречит сама себе.

В пункте 2 речь идёт о получении токена и белом экране. 

В тоже время в пункте 5 говорится, что это адрес, на который произойдёт редирект.

Зачем мне редирект на пустую белую страницу?

Аватар пользователя: Администратор

Здравствуйте, astor-piazzolla!

Страница пустая белая отображается, т.к. у файла нет дизайна, нет кода html. Файл содержит только скрипт.

Об этом частично выше в статье в параграфе "Редирект на страницы блога".

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

Зарегистрироваться
Имя:
Электронная почта:
Текст комментария:
Введите код с картинки:
картинка