
Для чего можно использовать API Я.Ру?
Помимо публикации постов различных типов, включая комментарии в свой блог и клубы можно сделать авторизацию пользователей Я.Ру на своем сайте и получать/обновлять данные их профиля.
Я сделал простейшую авторизацию и решил поделиться примером.
Первое, что нужно сделать это зарегистрировать новый клиент по адресу https://oauth.yandex.ru/client/new. Важно выбрать права, которые будут необходимы для вашего приложения. В данном случае я предлагаю делать приложения для Я.Ру. Предлагается два типа прав – чтение и запись. Изменить их потом будет нельзя, поэтому если Вы не уверены, то отметьте оба, либо потом зарегистрируйте новое приложение. Второй важный параметр – «Callback URI» – это адрес скрипта на вашем сайте, который будет принимать данные от yandex oauth об авторизации.
После создания Вы получите новый ID клиента, который нужно сохранить для дальнейшего использования.
Сразу создайте файлик config.php, в котором будут хранится нужные данные.
1 2 3 4 5 6 | //Ваш клиент ID define("YANDEX_CLIENT_ID", "123k1k3j1nk2j3nk12j3n65k"); //Адрес страницы, куда сервер yandex oauth будет возвращать после получения подтверждения от пользователя. define("OAUTH_CALLBACK", "http://www.example.com/yaru/callback.php"); //Включим сессию session_start(); |
Во-вторых, создадим файл redirect.php, который будет перенаправлять пользователя на oauth.yandex.ru. В этом файле перед редиректом можно добавить строки для сохранения в сессию или в куки, а так же проверки авторизации локального пользователя и т.п.
1 2 3 | require_once("./config.php"); //перенапрвляем на oauth.yandex.ru header("Location: https://oauth.yandex.ru/authorize?response_type=code&client_id=".YANDEX_CLIENT_ID ); |
В-третьих, создадим файл callback.php, в котором нам нужно получить token, который будет использоваться для дальнейшей авторизации.
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 | require_once("./config.php"); //Если сервер вернул параметр code if( $_REQUEST['code'] ) { //Готовим данные для POST запроса $data = array( "grant_type"=>"authorization_code", "client_id" => YANDEX_CLIENT_ID, "code" => $_REQUEST['code'] ); $ch = curl_init(); // Настроим на URL curl_setopt($ch, CURLOPT_URL, "https://oauth.yandex.ru/token"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // получаем овтет в формате json $body = curl_exec($ch); curl_close($ch); $res = json_decode( $body ); if( isset($res->access_token) ){ //Сохраняем полученный токен в сессию (можно так же сохранить в базу данных или другое хранилище) $_SESSION['yandex_access_token'] = $res->access_token; //перенаправим на скрипт авторизации header("Location: ./auth.php"); exit(); } } |
И последний шаг – создать файл авторизации (auth.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 | require_once("./config.php"); if( isset($_SESSION['yandex_access_token']) ) { $profile_path = "./data/".$_SESSION['yandex_access_token'].".xml"; //используем кэширование, что бы не скачаивать файл повторно if( !is_file($profile_path) ){ $ch = curl_init(); //Адрес получения профиля curl_setopt($ch,CURLOPT_URL,"https://api-yaru.yandex.ru/me/"); //Авторизация с token curl_setopt($ch,CURLOPT_HTTPHEADER,array("Authorization: OAuth ".$_SESSION['yandex_access_token'] )); curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true); $profile = curl_exec($ch); //Если произошла ошибка if( curl_error($ch) ) { echo curl_error($ch); exit(); }else{ //Сохраним данные fwrite(fopen($profile_path, "w"), $profile); } } if( is_file($profile_path ) ){ // парсим XML $doc = simplexml_load_file($profile_path); $links = $doc->link; $name = $doc->name[0]; $status = $doc->status->mood; foreach($links as $link ){ $attr = $link->attributes(); switch( $attr->rel ){ case "www": $www = $attr->href; break; case "userpic": $userpic = $attr->href; break; } } echo '<h1>Привет, узнаешь?</h1><a href="'.$www.'"><img src="'.$userpic.'" style="float: left; padding:0 20px;" />'; if( $name != '' ) echo $name; else echo $www; echo '</a>'; } } |
По аналогии Вы сможете написать чтение ленты друзей, получение списка друзей и постинг в блог пользователя. Обратите внимание, что все данные яндекс возвращает в UTF-8, поэтому пример, включая все комментарии тоже сделан в UTF-8. Подробную документацию смотрите на сайте api.yandex.ru.
- Пример в действии (приложение создано только для чтения).
- Скачать файлы примера
- Скачать логотип Я.ру в CMX





Спасибо за статью! Есть ли подобные решения на PHP по использованию Open Auth для других провайдеров, Twitter, Facebook и прочих?
Да, делал приложение для Twitter OAuth, постараюсь выложить пример в ближайшее время.
Спасибо большое! В идеале хотелось бы иметь какой-то PHP класс, используя который можно было бы авторизовывать юзеров популярных соцсетей. Можно конечно Loginza использовать, но мне не нравится решение на стороне (вдруг Loginza помрет). Во вторых не нравится, что при клике на иконку соцсети выскакивает всплывающее окошко Loginza, а хотелось, чтобы юзера сразу отправляли на авторизацию в соответствующую соцсеть.
Использовал вот эту библиотеку:
https://github.com/abraham/twitteroauth
там есть пример. Все довольно просто.
А не подскажете, можно ли таким образом авторизироваться в Вебмастер.Яндекс?
Похоже нет. По-крайней мере в документации не нашел.
На хостинге получилось запустить скрипт, потребовалось только добавить параметр «client_secret». Можно ли заставить локальный сайт научить работать с OAuth?
Может ли сайт запомнить авторизованного пользователя?
Если удастся сделать доступ яндексу до url, который записан в OAUTH_CALLBACK, то должно заработать, иначе не знаю как.
А что бы сохранить сессию используйте cookies или PHP session
Запомнить в смысле, чтобы яндекс тоже запомнил, что такой-то пользователь разрешает периодически считывать его данные, тогда авторизация выполялась бы автоматически. C OpenID такое возможно.
Как Вы считаете, OpenID и OAuth дополняют друг друга, или их функциональность пересекается?
Вам нужно сохранить у себя token, выданный яндексом и использовать его для работы с данными пользователя.
openid используется только для авторизации. Некоторые данные сервер позволяет получить, например E-mail и полное имя. OAuth же используется для доступа к данным не только профиля, а например для доступа к френдленте или к приватным сообщениям. Единственное общее, что можно их использовать для авторизации.