о WebMoney
Информационный портал о WebMoney
  
  
подписка  
реклама здесь 
обратная связь 
  Материалы      Вопросы и ответы     Курс обучения      Файлы
 Кофейня      WebMoney TOP      p2p      WM-Клуб      Гид   
о WebMoney / Материалы / Программируем авторизацию через ENUM

Программируем авторизацию через ENUM

© Никита Сенченко, 21.08.2015

моя оценка:
[средняя: 3.67]

Недавно сервис ENUM, в котором, как мы теперь знаем, уже 2,5 млн регистраций, открыл свое API для всех сторонних web-ресурсов. Благодаря этому появилась возможность авторизовать пользователей у себя на сайте, предварительно отправляя их на ENUM.ru.

Общий принцип

Это не изобретение велосипеда, это технология OAuth, и это очень похоже, например, на то, как работает подобная авторизация через Facebook. Смысл в следующем:

1) Сторонний САЙТ отправляет юзера на ENUM.ru.

2) Юзер авторизуется там с помощью приложения ENUM в своем смартфоне. ENUM.ru спрашивает у юзера разрешение передать САЙТУ его персональные данные (а именно: email и номер телефона). Юзер разрешает.

3) ENUM.ru возвращает юзера обратно на САЙТ и при этом посылает САЙТУ специальный одноразовый код.

4) САЙТ (уже без переходов пользователя, в фоновом режиме) по коду запрашивает у сервера ENUM токен.

5) Получив токен, САЙТ запрашивает у сервера ENUM информацию о пользователе (email и телефонный номер пользователя) и получает ее.

6) САЙТ, доверяя ENUM'у как источнику информации, совершает с пользователем какие-то действия, например, регистрирует его как нового пользователя в своей базе данных, сразу сохраняя у себя его email и номер телефона. В дальнейшем этого клиента можно точно так же отправлять авторизоваться на ENUM.ru, а получив его обратно после авторизации (опять-таки, с номером телефона и емайлом), сразу его логинить, пускать в личный кабинет и т.п.



Описание API и некоторые примеры реализации можно найти здесь.

Подготовка

С чего начать владельцу сайта, который хочет подключить API ENUM.ru?

Пройдите регистрацию в ENUM (если вы еще не зарегистрированы), установите приложение в свой смартфон. Войдите в личный кабинет. Заодно посмотрите, как работает ENUM с точки зрения клиента :)

На странице "Для владельцев сайтов" подайте заявку на регистрацию вашего сайта в сервисе. Дождитесь модерации.

После этого там же в конфигурации пропишите Redirect Url - адрес страницы вашего сайта, куда должен быть возвращен юзер после ENUM-авторизации. Этот адрес должен находиться на том же домене, который прописан в поле "Веб-сайт проекта".



Обратите внимание на присвоенные вам Client Id (идентификатор вашего сайта) и Client Secret (как бы секретный пароль). Они нам понадобятся.

Реализация на PHP

Ниже напишем простой код на чистом PHP (без ООП), который будет делать всё, что мы описали выше (кроме пункта 6, так как он полностью зависит от бизнес-логики САЙТА, другими словами, от целей, которые преследуются). На веб-сервере должны быть включены модули cURL и json, они понадобятся.

Сначала определим некоторые константы (впишите свои данные):


$RedirectURL = "http://mysite.ru/auth"; // тот же URL, что указан в настройках
$ClientID = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"; // Client Id из настроек
$ClientSecret = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"; // Client Secret из настроек


1) Отправляем пользователя на https://auth.enum.ru/OAuth/Authorize , при этом передаем следующие параметры методом GET:
  • response_type - строка "code";
  • client_id - ClientID;
  • redirect_uri - RedirectURL;
  • scope - набор запрашиваемых данных через пробел (на практике, это всегда будет выглядеть как строка "email phone");
  • state - здесь можно передавать что угодно, например, какие-то свои параметры, которые будут протранслированы через ENUM.ru и возвращены вам обратно.

    Значения параметров, в которых есть специальные символы или пробелы, должны быть закодированы в urlencoded, для этого в PHP надо использовать функцию rawurlencode().

    Отдельно скажем про параметр state. Если мы хотим передать в нем набор своих параметров с их значениями, то сначала их лучше уложить в массив, а массив сериализировать.

    Итак, что получилось на PHP:

    $baseurl = "https://auth.enum.ru/OAuth/Authorize";
    $state = serialize(Array("myparam1"=>"myvalue1", "myparam2"=>"myvalue2")); //закомментируйте, если не используете state
    $params="?client_id=".$ClientID."&redirect_uri=".rawurlencode($RedirectURL)."&scope=".rawurlencode("email phone")."&response_type=code&state=".rawurlencode($state);
    $url = $baseurl.$params;
    header ("Location: ".$url);
    exit;


    2) Юзер проходит авторизацию на стороне ENUM.ru с помощью приложения в смартфоне. Юзер соглашается с тем, что его email и телефон, известные ENUM'у, будет переданы САЙТУ.



    3) ENUM возвращает юзера обратно на САЙТ (на RedirectURL) и через GET передает параметр code, который содержит одноразовый код. Таким образом, прочитать его можно из $_GET['code']. Также примем обратно и десериализируем то, что мы отправляли в параметре state (если, конечно, отправляли):

    $state = unserialize(rawurldecode($_GET['state']));
    $myparam1 = $state['myparam1'];
    $myparam2 = $state['myparam2'];

    4) Используя только что полученный код, запросим токен. Для этого на https://auth.enum.ru/OAuth/Token методом POST отправим следующие параметры (напомню, обязательно в виде urlencoded):
  • grant_type - строка "authorization_code";
  • code - строка с кодом, который мы получили;
  • redirect_uri - RedirectURL
  • client_id - ClientID;
  • client_secret - ClientSecret;

    Передачу параметров реализуем с помощью cURL:

    $baseurl = "https://auth.enum.ru/OAuth/Token";
    $params="client_id=".$ClientID."&client_secret=".$ClientSecret."&redirect_uri=".rawurlencode($ReturnURL)."&grant_type=authorization_code&code=".$_GET['code'];
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $baseurl);
    curl_setopt($ch, CURLOPT_POST,TRUE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,TRUE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
    $page = curl_exec($ch);
    //if(curl_errno($ch)) echo "Curl Error number='".curl_errno($ch)."' err desc='".curl_error($ch)."' \n"; // раскомментируйте эту строку, чтобы увидеть ошибки выполнения
    curl_close($ch);


    Обратите внимание на эту строку:

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);


    Данную опцию можно установить в TRUE, это более безопасно (так как будет проверяться сертификат сайта enum.ru), но с TRUE заработает не у всех.

    Ответ от сервера ENUM - упакован в json. Преобразуем его в массив, чтобы было легче обращаться к параметрам:

    $answer = json_decode($page, true);


    Из всех параметров ответа нам нужен только access_token. В нем находится токен - длинная строка из цифр и символов. Сохраним его:

    $token = $answer['access_token'];


    5) Наконец, последнее действие. Используя токен, запросим email и телефон юзера. Для этого на https://auth.enum.ru/api/Me методом GET отправляем пустой запрос. Но в HTTP-заголовке должно быть такое:

    Authorization: Bearer {токен}


    С помощью cURL это делается так:

    $baseurl = "https://auth.enum.ru/api/Me";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $baseurl);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,TRUE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Authorization: Bearer $token"));
    $page = curl_exec($ch);
    //if(curl_errno($ch)) echo "Curl Error number='".curl_errno($ch)."' err desc='".curl_error($ch)."' \n"; // раскомментируйте эту строку, чтобы увидеть ошибки выполнения
    curl_close($ch);


    Ответ в виде json, распакуем его, как и в предыдущий раз:

    $answer = json_decode($page, true);


    Email юзера и его телефон содержатся соотетственно в полях email и phone :)

    $phone = $answer['phone'];
    $email = $answer['email'];


    Что с ними делать и как использовать - решаете уже вы сами.



    Ниже приводим полный код из этой статьи на чистом PHP:

    // ==== Определяем константы (например, в конфиг-файле)
    $RedirectURL = "http://mysite.ru/auth"; // тот же URL, что указан в настройках
    $ClientID = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"; // Client Id из настроек
    $ClientSecret = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"; // Client Secret из настроек

    // ==== Следующий код помещаем в том месте, где инициируется отправка юзера на ENUM.ru
    $baseurl = "https://auth.enum.ru/OAuth/Authorize";
    $state = serialize(Array("myparam1"=>"myvalue1", "myparam2"=>"myvalue2")); //закомментируйте, если не используете state
    $params="?client_id=".$ClientID."&redirect_uri=".rawurlencode($RedirectURL)."&scope=".rawurlencode("email phone")."&response_type=code&state=".rawurlencode($state);
    $url = $baseurl.$params;
    header ("Location: ".$url);
    exit;

    // ==== Следующий код помещаем в RedirectURL
    if($_GET['code']) { //получили код
    $state = unserialize(rawurldecode($_GET['state'])); //закомментируйте, если не используете state
    $myparam1 = $state['myparam1']; //закомментируйте, если не используете state
    $myparam2 = $state['myparam2']; //закомментируйте, если не используете state
    // По коду запрашиваем токен
    $baseurl = "https://auth.enum.ru/OAuth/Token";
    $params="client_id=".$ClientID."&client_secret=".$ClientSecret."&redirect_uri=".rawurlencode($ReturnURL)."&grant_type=authorization_code&code=".$_GET['code'];
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $baseurl);
    curl_setopt($ch, CURLOPT_POST,TRUE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,TRUE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); //попробуйте поменять на TRUE
    curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
    $page = curl_exec($ch);
    //if(curl_errno($ch)) echo "Curl Error number='".curl_errno($ch)."' err desc='".curl_error($ch)."' \n"; //раскомментируйте эту строку, чтобы увидеть ошибки выполнения
    curl_close($ch);
    $answer = json_decode($page, true);
    $token = $answer['access_token']; //здесь токен
    if($token) {
    //по токену запрашиваем email и телефон юзера
    $baseurl = "https://auth.enum.ru/api/Me";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $baseurl);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,TRUE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); //попробуйте поменять на TRUE
    curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Authorization: Bearer $token"));
    $page = curl_exec($ch);
    //if(curl_errno($ch)) echo "Curl Error number='".curl_errno($ch)."' err desc='".curl_error($ch)."' \n"; //раскомментируйте эту строку, чтобы увидеть ошибки выполнения
    curl_close($ch);
    $answer = json_decode($page, true);
    $phone = $answer['phone']; //здесь телефон юзера
    $email = $answer['email']; //здесь email юзера
    }
    }
    группа: Материалы
    категории: ENUM | Программинг |
    прочтений: 2760
    Если Вам понравилась статья, подпишитесь на оповещения:

    Комментарии (2)
    Anton 23.09.15 20:39 #
    О! Спасибище!!!
    Anton 23.09.15 20:47 #
    Только я не понял, где взять сертификат E-NUMи подключить его через
    curl_setopt($ch, CURLOPT_CAINFO, $Path_Certs) - как это сделано в библиотеке "wmxml.inc.php"?

    введите этот код
    Мое имя:
    я не зарегистрирован и не хочу
    это моё зарегистрированное имя
    хочу зарегистрировать это имя
    Email:      
     оповещать об ответах
  •    Что нового почитать?
    Мой номер телефона утерян и не подлежит восстановлению. Как быть? 06.10.16 [3]
    ВОПРОС: Долго не пользовался своей симкой. Номер заблокирован, восстановлению не подлежит. Как востановить доступ к кошельку?
    Автомобилистам на заметку: как оплатить штраф по WM 04.10.16
    Сегодня мы хотим напомнить о возможностях, которые существуют в WebMoney для оплаты штрафов ГАИ и дорожных сборов. Если неприятность всё же произошла ...
    На WebMoney Merchant можно принимать Биткоины 30.09.16 [5]
    Если вы на вашем сайте принимаете WebMoney и делаете это через WebMoney Merchant, то для вас есть хорошая новость. Теперь с вами смогут рассчитаться т...
    Муравей-бот отвечает на вопросы о WebMoney в Telegram 27.09.16
    WebMoney запустил интеллектуального бота-помощника для мессенджера Telegram. Он постарается понять ваш вопрос и дать на него ответ.Для начала, разбере...
    Автоплатежи помогут не забыть об оплате 27.09.16
    В WebMoney Keeper, а также в личный кабинет Telepay добавлена опция автоплатежа для 3х крупнейших мобильных операторов России: Билайна, МТС и Мегафона...
    Новая библиотека для платформы .Net 14.09.16
    Разработчикам будет полезно узнать, что выпущена новая версия библиотеки для работы с XML-интерфейсами WebMoney для платформы Microsoft .Net.В ней реа...
    WebMoney пришла в Молдову 14.09.16 [1]
    WebMoney предоставила возможность работы с кошельком, номинированным в молдавских леях. Однако, кошелек этот не совсем обычный.Во-первых, кошелек созд...
    В обновленных Киперах появились регулярные платежи 04.08.16
    Обновилась вся линейка мобильных Киперов (iOS, Android, Windows Phone, MacOs X и BlackBerry OS 10), а также браузерный Keeper Standard.Главное новшест...

       Кофейня (форум)
    Вчера на форуме вебмани обосрал вебмани, седне лок 09.12.16
    Проблема с Кипером WinPro версии 3.9.9.8 01.12.16
    Работает ли корректно в данный момент Х19? 30.11.16

       p2p
    Меняют 26300 UAH на 1000 WMZ (курс:26.3) 09.12.16
    Меняют 200000 Qiwi на 200000 WMR (курс:1:1) 09.12.16
    Меняют 10000 Яндекс.Д на 10000 Qiwi (курс:1:1) 09.12.16

       WebMoney TOP
    Зарегистрирован Обмен24 Ввод/Вывод WebMoney, ЯД, QIWI на Privat24, СберБанк, АльфаБанк, ТКСБ и другие. Быстрая обработка зая...
    Зарегистрирован Green Cash Обменный пункт WebMoney в Москве. Ввод/вывод WebMoney на выгодных условиях. Работаем 7 дней в неделю...
    Зарегистрирован Bestchange.ee Ввод и вывод WM в Эстонии и Европе. Карты (чеки Paymer), высылаем на e-mail. Оплату принимаем на бан...

       WM-Клуб
    Присоединился Василий Галанов
    Присоединился Евгений Кудрявцев
    Присоединился Николай Бирюк


     
    Все права на материалы, опубликованные на owebmoney.ru, охраняются в соответствии с законом об авторском праве. Разрешено копирование без согласования при условии указания гиперссылки на сайт (без атрибута nofollow и сокрытий) непосредственно до\после материала.