Написание приложения для Я.Ру с авторизацией через Yandex Oauth (пример на PHP)

Логотип Я.Ру (ya.ru)

Для чего можно использовать 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.

Об авторе AlexeyBalin

AlexeyBalin
Разрабатываю систему Социального поиска FASQu. Поддерживаю большое количество сайтов, работающих на выделенных серверах и виртуальных хостинг-аккаунтах.


Запись опубликована в рубрике Программирование с метками , , , . Добавьте в закладки постоянную ссылку.


Поделиться с друзьями




11 комментариев: Написание приложения для Я.Ру с авторизацией через Yandex Oauth (пример на PHP)

  1. index говорит:

    Спасибо за статью! Есть ли подобные решения на PHP по использованию Open Auth для других провайдеров, Twitter, Facebook и прочих?

    • AlexeyBalin AlexeyBalin говорит:

      Да, делал приложение для Twitter OAuth, постараюсь выложить пример в ближайшее время.

      • index говорит:

        Спасибо большое! В идеале хотелось бы иметь какой-то PHP класс, используя который можно было бы авторизовывать юзеров популярных соцсетей. Можно конечно Loginza использовать, но мне не нравится решение на стороне (вдруг Loginza помрет). Во вторых не нравится, что при клике на иконку соцсети выскакивает всплывающее окошко Loginza, а хотелось, чтобы юзера сразу отправляли на авторизацию в соответствующую соцсеть.

  2. Max говорит:

    А не подскажете, можно ли таким образом авторизироваться в Вебмастер.Яндекс?

  3. Алексей говорит:

    На хостинге получилось запустить скрипт, потребовалось только добавить параметр «client_secret». Можно ли заставить локальный сайт научить работать с OAuth?
    Может ли сайт запомнить авторизованного пользователя?

    • admin говорит:

      Если удастся сделать доступ яндексу до url, который записан в OAUTH_CALLBACK, то должно заработать, иначе не знаю как.

      А что бы сохранить сессию используйте cookies или PHP session

      • Алексей говорит:

        Запомнить в смысле, чтобы яндекс тоже запомнил, что такой-то пользователь разрешает периодически считывать его данные, тогда авторизация выполялась бы автоматически. C OpenID такое возможно.
        Как Вы считаете, OpenID и OAuth дополняют друг друга, или их функциональность пересекается?

        • admin говорит:

          Вам нужно сохранить у себя token, выданный яндексом и использовать его для работы с данными пользователя.

          openid используется только для авторизации. Некоторые данные сервер позволяет получить, например E-mail и полное имя. OAuth же используется для доступа к данным не только профиля, а например для доступа к френдленте или к приватным сообщениям. Единственное общее, что можно их использовать для авторизации.

  4. Владимир говорит:

    Спасибо большое за реальный пример работы через приложение!!!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *