|
|
|||||||
|
о WebMoney / Материалы / Программируем авторизацию через ENUM
Программируем авторизацию через ENUM© Никита Сенченко, 21.08.2015
Недавно сервис 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: Значения параметров, в которых есть специальные символы или пробелы, должны быть закодированы в 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): Передачу параметров реализуем с помощью 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: // ==== Определяем константы (например, в конфиг-файле) группа: Материалы
другие материалы в этих категориях:
Новая библиотека для платформы .Net Влияет ли ENUM на работу интерфейса Х2? ENUM обновил сайт В E-NUM обязательно указывать номер телефона такой же, как в WebMoney? Обновлены мобильные Киперы, а ENUM теперь можно носить в часах прочтений: 5947
О! Спасибище!!!
Только я не понял, где взять сертификат E-NUMи подключить его через
curl_setopt($ch, CURLOPT_CAINFO, $Path_Certs) - как это сделано в библиотеке "wmxml.inc.php"? |
|
Все права на материалы, опубликованные на owebmoney.ru, охраняются в соответствии с законом об авторском праве. Разрешено копирование без согласования при условии указания гиперссылки на сайт (без атрибута nofollow и сокрытий) непосредственно до\после материала.
|
|