[Примеры] Авторизация (получение access и refresh token) OAuth 2.0 Яндекс и работа с API на PHP
Содержание:
1. Регистрация приложения
Переходим по ссылке https://oauth.yandex.ru/client/new и регистрируем новое приложение на OAuth-сервере Яндекса.
После регистрации приложения получаем «ID» и «Пароль» для доступа к приложению.
2. Пример получения токена для доступа к API Яндекса на PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
session_start(); $clientId = 'ad71d04727ef4f4abd33afb7cfa810058332'; // ID приложения $clientSecret = '15a3fc22e0c04b89b9fd383dc3aa39fe007e'; // Пароль приложения $redirectUri = 'http://localhost/_blog/tests/yandex-api/oauth.php'; // Адрес, на который будет переадресован пользователь после прохождения авторизации // Формируем ссылку для авторизации $params = array( 'client_id' => $clientId, 'redirect_uri' => $redirectUri, 'response_type' => 'code', // Список необходимых приложению в данный момент прав доступа, разделенных пробелом. // Права должны запрашиваться из перечня, определенного при регистрации приложения. // Узнать допустимые права можно по ссылке https://oauth.yandex.ru/client/<client_id>/info, указав вместо <client_id> идентификатор приложения. // Если параметр scope не передан, то токен будет выдан с правами, указанными при регистрации приложения. // Параметр позволяет получить токен только с теми правами, которые нужны приложению в данный момент. 'scope' => 'webmaster:verify webmaster:hostinfo metrika:read', ); echo '<a href="https://oauth.yandex.ru/authorize?' . http_build_query( $params ) . '">Авторизация через Яндекс</a>'; if ( isset( $_GET['code'] ) ) { // Формирование параметров (тела) POST-запроса с указанием кода подтверждения $query = array( 'grant_type' => 'authorization_code', 'code' => $_GET['code'], 'client_id' => $clientId, 'client_secret' => $clientSecret ); $query = http_build_query( $query ); // Формирование заголовков POST-запроса $header = "Content-type: application/x-www-form-urlencoded"; // Выполнение POST-запроса $opts = array( 'http' => array( 'method' => 'POST', 'header' => $header, 'content' => $query ) ); $context = stream_context_create( $opts ); if ( ! $content = @file_get_contents( 'https://oauth.yandex.ru/token', false, $context ) ) { $error = error_get_last(); throw new Exception( 'HTTP request failed. Error: ' . $error['message'] ); } $response = json_decode( $content ); // Если при получении токена произошла ошибка if ( isset( $response->error ) ) { throw new Exception( 'При получении токена произошла ошибка. Error: ' . $response->error . '. Error description: ' . $response->error_description ); } $accessToken = $response->access_token; // OAuth-токен с запрошенными правами или с правами, указанными при регистрации приложения. $expiresIn = $response->expires_in; // Время жизни токена в секундах. // Токен, который можно использовать для продления срока жизни соответствующего OAuth-токена. // https://tech.yandex.ru/oauth/doc/dg/reference/refresh-client-docpage/#refresh-client $refreshToken = $response->refresh_token; // Сохраняем токен в сессии $_SESSION['yaToken'] = array( 'access_token' => $accessToken, 'refresh_token' => $refreshToken ); } elseif ( isset( $_GET['error'] ) ) { // Если при авторизации произошла ошибка throw new Exception( 'При авторизации произошла ошибка. Error: ' . $_GET['error'] . '. Error description: ' . $_GET['error_description'] ); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
/** * Обновление токена с использованием refresh_token * https://tech.yandex.ru/oauth/doc/dg/reference/refresh-client-docpage/ * Примечание. Основной токен может не обновиться, если оставшийся срок его жизни достаточно длительный и выдавать новый токен нет необходимости. *****************************************************************************************/ $yaToken = $_SESSION['yaToken']; $refreshToken = $yaToken['refresh_token']; // Формирование параметров (тела) POST-запроса с указанием кода подтверждения $query = array( 'grant_type' => 'refresh_token', 'refresh_token' => $refreshToken, 'client_id' => $clientId, 'client_secret' => $clientSecret ); $query = http_build_query( $query ); // Формирование заголовков POST-запроса $header = "Content-type: application/x-www-form-urlencoded"; // Выполнение POST-запроса $opts = array( 'http' => array( 'method' => 'POST', 'header' => $header, 'content' => $query ) ); $context = stream_context_create( $opts ); if ( ! $content = @file_get_contents( 'https://oauth.yandex.ru/token', false, $context ) ) { $error = error_get_last(); throw new Exception( 'HTTP request failed. Error: ' . $error['message'] ); } $response = json_decode( $content ); // Если при получении токена произошла ошибка if ( isset( $response->error ) ) { throw new Exception( 'При получении токена произошла ошибка. Error: ' . $response->error . '. Error description: ' . $response->error_description ); } $accessToken = $response->access_token; // OAuth-токен с запрошенными правами или с правами, указанными при регистрации приложения. $expiresIn = $response->expires_in; // Время жизни токена в секундах. $refreshToken = $response->refresh_token; // Сохраняем новый токен в сессии $_SESSION['yaToken'] = array( 'access_token' => $accessToken, 'refresh_token' => $refreshToken ); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
/** * Выполнение запросов к API *****************************************************************************************/ // Извлекаем информацию о токене из сессии $yaToken = $_SESSION['yaToken']; $accessToken = $yaToken['access_token']; // Получаем информацию о пользователе if ( ! $content = @file_get_contents( 'https://login.yandex.ru/info?format=json&with_openid_identity=1&oauth_token=' . $accessToken ) ) { $error = error_get_last(); throw new Exception( 'HTTP request failed. Error: ' . $error['message'] ); } $response = json_decode( $content ); // Если возникла ошибка if ( isset( $response->error ) ) { throw new Exception( 'При отправке запроса к API возникла ошибка. Error: ' . $response->error . '. Error description: ' . $response->error_description ); } $userLogin = $response->login; // Логин пользователя $userId = $response->id; // ID пользователя var_export( $response ); /* stdClass::__set_state(array( 'openid_identities' => array ( 0 => 'http://openid.yandex.ru/alex-codd/', ), 'login' => 'alex.codd', 'id' => '17865449397', )) */ |