о 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 | Программинг |
    прочтений: 4710
    Если Вам понравилась статья, подпишитесь на оповещения:

    Комментарии (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:      
     оповещать об ответах
  •    Что нового почитать?
    Снижение комиссии при выводе WMX, WMH, WML 12.04.18
    Для участников системы WebMoney с 26 марта 2018 года доступен вывод по расписанию для WMX, WMH, WML со сниженной комиссией.
    Вывод из системы WebMoney на примере WMU (Вебмани Гривни ). 29.03.18
    Многие сталкивались с проблемой,когда хотят вывести из системы WebMoney,где лучше,быстрее и безопасно.
    Как пополнить кошелёк WebMoney через терминал ПриватБанка (Украина). 16.03.18 [2]
    Как пополнить кошелёк WebMoney через терминал ПриватБанка (Украина). Актуально для жителей Украины.
    Кошелёк Bitcoin Cash WMH в системе WebMoney (Вебмани). 13.03.18 [1]
    Кошелёк Bitcoin Cash WMH в системе WebMoney (Вебмани). Как создать,пополнить и вывести Кошелёк Bitcoin Cash( WMH) в системе WebMoney (Вебмани).
    КОШЕЛЁК WMX (BITCOIN) В СИСТЕМЕ WEBMONEY. 06.03.18
    После выхода ролика про создание ролика лайткоин (litecoin) многие спрашивают про кошелёк биткоина в системе Webmoney.Об этом наш новый ролик.
    WebMoney запустила сервис для стримеров. 03.03.18
    В последнее время чрезвычайно популярны онлайн-трансляции, они получили название стрим, а люди, которые их ведут – стримеры. WebMoney предоставляет ун
    Как пополнить WMU через платёжный терминал на Украине. 27.02.18
    Гуляя недавно по Киеву,надо было пополнить кошелёк WMU,для оплаты сотового,и если у вас нету в друзьях обменный пункт=),вам этот ролик поможет.
    В WebMoney появился кошелёк Litecoin 25.02.18 [1]
    В WebMoney появился кошелёк Litecoin.Крипто-бум,... который в последнее время потрясает электронную коммерцию, достиг и WebMoney. Не так давно WebMoney п

       Кофейня (форум)
    как я спасла свой бизнес 25.11.18
    Тем, кто заботится о себе 25.11.18
    Расскажу свою небольшую историю! 16.11.18

       p2p
    Меняют 27450 UAH на 1000 WMZ (курс:27.45) 11.12.18
    Меняют 10000 UAH на 24750 Qiwi (курс:2.48) 11.12.18
    Меняют 31050 UAH на 1000 WME (курс:31.05) 11.12.18

       WebMoney TOP
    Зарегистрирован Интернет магазин цифровых товаров MyArena На MyArena можно продавать и покупать программное обеспечение, скрипты, музыку, видео, электронные к...
    Зарегистрирован Лосиный Лес Блог о рекламе и деньгах. Обзоры бирж и Webmoney....
    Зарегистрирован ichanger.net Сервис iChanger.Net является Вашим надежным и компетентным спутником в сфере обмена электронных валю...

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


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