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

Login.WebMoney: авторизуем, выводим из сумрака

Материал для разработчиков и владельцев сайтов.

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

Введение
Принцип работы сервиса Login.WebMoney
Предварительные настройки
Авторизация пользователя на стороне Login.WebMoney
Получение тикета
Проверка тикета
Что еще нужно знать?

Введение

Количество сетевых проектов, связавших свой бизнес с WebMoney, растёт изо дня в день. Клиенты этих проектов одновременно являются пользователями WMT, и часто возникает необходимость точно их идентифицировать и получать достоверные WMID. Например, обменный пункт внедряет бонусную программу и хочет привязать размер скидки к конкретному WM-идентификатору (это разумно, поскольку обычный логин, на который начисляется скидка, пользователи смогут свободно передавать друг другу, тем самым обманывая обменник). Другой пример: кредитный сервис, автоматизировавший выдачу WM-кредитов, желает авторизовывать кредиторов на своём сайте и точно определять их WMID, так как это очень важно для снижения рисков. А вот еще: некий сайт проводит розыгрыш подарков среди пользователей WebMoney, для чего ему необходимо определять и сохранять их WM-идентификаторы, так как WMID являтся единственным, что однозначно идентифицирует пользователя WebMoney, как номер паспорта однозначно идентифицирует человека.

Подобных примеров можно привести массу. Ранее для авторизации WebMoney-пользователей на своём сайте нужно было программировать непростой интерфейс X7 для входа по Keeper Classic и даже особым образом настраивать веб-сервер для входа по сертификату Keeper Light (Эти способы, впрочем, никто не отменял, и так организовывать аутентификацию на своём сайте можно и сейчас.) Не говоря уже о том, что авторизация с помощью системы Enum и авторизация для пользователей GSM Кипера вообще была недоступна для владельцев сайтов. Поэтому специально для упрощения данной задачи разработчики WebMoney предложили сервис Login.WebMoney, который все эти проблемы решает и с которым мы сейчас познакомимся.

Принцип работы сервиса Login.WebMoney

Login.WebMoney работает по следующему принципу. Допустим, ваш сайт должен авторизовать какого-то WebMoney-пользователя, то есть определить его WMID. Для этого он просто направляет его на специальную страницу сервиса Login.WebMoney, где пользователь и проходит авторизацию, выбирая любой удобный для него способ: Keeper Classic, Light, Enum или GSM Keeper. То есть реально авторизуете пользователя не вы, а система WebMoney. Далее Login.WebMoney генерирует тикет - уникальный сессионный ключ, состоящий из символов и удовлетворяющий регулярному выражению [a-zA-Z0-9\$\!\/]{32,48}. Этот тикет передаётся странице вашего сайта вместе с WMID только что авторизованного пользователя. На ту же страницу перенаправляется и сам пользователь. Ваш сайт, получив эти данные, перепроверяет их: запрашивает у сервера Login.WebMoney, а действительно ли существует такой тикет и действительно ли он соответствует такому WMID. Получив положительный ответ, ваш сайт считает полученный WMID достоверным. Всё!

Рассмотрим теперь всё это на конкретном примере и покажем, как это можно запрограммировать. Напомним, перед нами стоит задача: получить достоверный WMID пользователя и тем самым авторизовать его на своём сайте.

Предварительные настройки

Идём на login.wmtransfer.com (если нужно - принудительно переключаем язык с английского на русский в верхнем правом углу). Жмём Войти, авторизуемся. Нажимаем пункт меню Сайт. Здесь задаём основные настройки, а именно:

  • Название вашего сайта или сетевого проекта (так его будут видеть пользователи).
  • Время жизни тикета (в минутах). Это время, на протяжении которого сгенерированный системой тикет будет актуальным, то есть о нём система будет давать ответ, что такой тикет существует. По умолчанию установлено 20 минут, но если нет каких-то особых обстоятельств, из-за которых вам нужно будет проверять тикет длительное время и много раз, рекомендую в целях безопасности уменьшить это значение до 1-2 минут. Этого вполне хватит, чтобы проверить тикет один раз.
  • Методы авторизации, которые будут доступны посетителям вашего сайта. Не вижу причин снимать здесь какие-то галочки.
  • Нажимаем кнопку [Сохранить].

    Идём в раздел Url сайта, нажимаем там ссылку Добавить и вводим точный URL страницы нашего сайта, которая будет отвечать за авторизацию. На эту страницу пользователь будет возвращаться с сервиса Login.WebMoney, туда же будет передаваться тикет, там же будет происходить и проверка тикета. URL вводите полностью, с протоколом. Для безопасности рекомендуем работать по протоколу https. Жмём [Добавить].

    URL появился в списке. Сервис присвоил ему специальный urlid (первая колонка), состоящий из множеств букв и цифр. Для чего он нужен - разберёмся позднее.

    Добавленные URL можно редактировать (важно: при этом меняется urlid !) или удалять. Редактирование, по сути, равносильно удалению старого и добавлению нового URL.

    Обратите внимание, что в список можно добавлять любое количество разных URL, даже относящихся к разным доменам, например, http://site1.ru/enter.php, https://login.site2.ru/welcome/ и т.д. Все URL равноправны, вы сможете использовать все их параллельно и одновременно. Однако, увы, Login.WebMoney позволяет указывать только одно имя сайта (интернет-проекта) и устанавливать только одни настройки (страница Сайт) на один ваш WMID. Таким образом, если вы хотите использовать WM-авторизацию на нескольких сетевых проектах - смело добавляйте все эти URL, но название для них придумайте какое-то одно, общее.

    Авторизация пользователя на стороне Login.WebMoney

    В тот момент, когда вам нужно авторизовать пользователя, вы отправляете его по адресу https://login.wmtransfer.com/GateKeeper.aspx?RID=urlid, где вместе urlid подставьте значение urlid, выданное системой вашему URL. Скажем, для нашего примера: https://login.wmtransfer.com/GateKeeper.aspx?RID=31055ee4-7ebc-410e-acab-9a2c00332e01. Здесь 31055ee4-7ebc-410e-acab-9a2c00332e01 - это urlid для URL http://owebmoney.ru/files/wmlogin/login.php , добавленного нами в систему (см. скриншот выше). Чуть позже, после того как Login.WebMoney авторизует пользователя, он отправит тикет и WMID пользователя (а также самого пользователя) именно на данный URL. Но к этому мы подойдём через пару минут.

    Кстати, сайт Login.WebMoney пытается определить родной язык пользователя и правильно "подсунуть" ему свою русскую или английскую версию. Однако, иногда это не срабатывает, поэтому в той же адресной строке вы можете принудительно передавать параметр lang для того, чтобы указать сайту Login.WebMoney, какой язык использовать. lang=ru-RU укажет, что нужно отобразить русскую версию, а lang=en-US - английскую. Пример: https://login.wmtransfer.com/GateKeeper.aspx?RID=31055ee4-7ebc-410e-acab-9a2c00332e01&lang=ru-RU

    Попав на сайт Login.WebMoney, ваш пользователь видит следующее:

    Здесь он выбирает тот метод авторизации, который ему подходит, но только из числа тех методов, которые вы разрешили в настройках. Обратите внимание, что вверху авторизационной формы юзер видит название вашего сайта (мы задавали его в настройках) и URL, куда он попадёт после авторизации.

    Получение тикета

    Система авторизует пользователя, т.е. определяет его WMID. Сразу после этого она перенаправляет его на ваш URL, ассоциированный с тем urlid, по которому пользователь только что попал на сайт Login.WebMoney. На тот же URL система передаёт следующие параметры методом POST:

    • WmLogin_AuthType – способ аутентификации. Значения:
         KeeperClassic – аутентификация через WebMoney Keeper Classic
         KeeperLight - аутентификация через сертификат WebMoney Keeper Light
         Enum – аутентификация через сервис E-num
         Telepat – аутентификация через сервис telepat
    • WmLogin_Created - UTC время создания авторизационного тикет в формате dd.mm.yyyy hh:mm:ss
    • WmLogin_Expires - UTC время истечения срока действия тикет в формате dd.mm.yyyy hh:mm:ss
    • WmLogin_LastAccess - UTC время последнего обращения к тикету в формате dd.mm.yyyy hh:mm:ss
    • WmLogin_Ticket - авторизационный тикет. Удовлетворяет регулярному выражению [a-zA-Z0-9\$\!\/]{32,48}
    • WmLogin_UrlID - urlid возврата, на который осуществляется POST
    • WmLogin_UserAddress - IP адрес пользователя
    • WmLogin_WMID – WMID пользователя

    Как видим, мы получаем от системы много информации, но в классическом случае (и в нашем примере тоже) не вся эта информация нам понадобится. Самое важное здесь - параметры WmLogin_Ticket и WmLogin_WMID. Первый содержит тикет (напомним, тикет - это уникальный неповторяющийся сессионный пароль), а второй содержит WMID пользователя.

    Понятно, что любой злоумышленник может сымитировать отправку на ваш URL такой формы с вымышленным тикетом и WMID. Поэтому вы не должны принимать всё за чистую монету и должны обязательно проверять достоверность получаемых тикетов. Но этим мы займёмся чуть позже, а пока напишем простой код на PHP, который будет по формальным признакам отсекать ложные вызовы, поступающие на наш URL, уже на этом этапе.

    // !!!!!! В следующей строке укажите urlid, соответствующий ВАШЕМУ URL $urlid="31055ee4-7ebc-410e-acab-9a2c00332e01"; $testticket=preg_match('/^[a-zA-Z0-9\$\!\/]{32,48}$/i', $_POST['WmLogin_Ticket']); if($_POST['WmLogin_UrlID']==$urlid && $testticket==1) { echo "=== Тикет получен успешно === <br>"; // Продолжаем выполнение скрипта // ... } else echo "=== Ошибка при получении тикета ===";

    Здесь мы: 1) проверили, что параметр WmLogin_UrlID, полученный нашим скриптом, действительно совпадает с тем urlid, который выдала нам система (см. третий скриншот в статье); 2) убедились, что тикет имеет правильный формат. Если проверки пройдены успешно - продолжаем выполнение скрипта; если нет, то выводим сообщение об ошибке.

    Проверка тикета

    Как мы уже говорили, после получения тикета нужно обязательно проверить его подлинность. Только когда мы убедимся, что тикет подлинный, мы можем быть на 100% уверенными, что верен и WMID пользователя, полученный нами вместе с данными тикетом.

    Проверять подлинность тикета будем в том же скрипте, который только что этот тикет и получил. Так, скорее всего, будет и в вашем случае. Проверка занимает 1-2 секунды, в это время пользователь будет ждать загрузки URL в браузере.

    Проверка тикета может производиться согласно SOAP-интерфейсу или XML-интерфейсу. С протоколом SOAP в PHP работать не очень удобно, поэтому воспользуемся XML-интерфейсом. Этот интерфейс заключается в том, что мы должны отправить XML-запрос с проверяемым тикетом и рядом других параметров на URL https://login.wmtransfer.com/ws/authorize.xiface и получить от системы XML-ответ с результатами проверки.

    Запрос должен иметь следующий формат:

    <request> <siteHolder></siteHolder> <user></user> <ticket></ticket> <urlId></urlId> <authType></authType> <userAddress></userAddress> </request>

    Что должно передаваться в этих параметрах:

    • siteHolder - ваш WMID (т.е. WMID владельца сайта, зарегистрированного в Login.WebMoney);
    • user - WMID пользователя (получен ранее от Login.WebMoney вместе с тикетом);
    • ticket - проверяемый тикет;
    • urlId - urlid, по которому был авторизован пользователь;
    • authType - способ аутентификации (получен ранее от Login.WebMoney вместе с тикетом);
    • userAddress - IP-адрес пользователя (получен ранее от Login.WebMoney вместе с тикетом).

    Формируем XML-запрос:

    $xml=" <request> <siteHolder>$mywmid</siteHolder> <user>".$_POST['WmLogin_WMID']."</user> <ticket>".$_POST['WmLogin_Ticket']."</ticket> <urlId>".$urlid."</urlId> <authType>".$_POST['WmLogin_AuthType']."</authType> <userAddress>".$_POST['WmLogin_UserAddress']."</userAddress> </request> ";

    Запрос нужно отправлять методом POST, поэтому будем использовать библиотеку libcurl (CURL). Как правило, она включена в сборку PHP даже на недорогих виртуальных хостингах. Проверить, включена ли поддержка CURL на вашем сервере, можно с помощью функции phpinfo() или так: echo function_exists("curl_init");.

    // Отправляем запрос и получаем ответ $resxml=_GetAnswer($xml);

    Напишем функцию _GetAnswer(), которая будет получать на вход наш XML-пакет с запросом, отправлять его на сервер Login.WebMoney, используя CURL, и получать ответ, отдавая этот ответ на выходе.

    function _GetAnswer($xml){ global $CertPath; // Инициализируем сеанс CURL $ch = curl_init("https://login.wmtransfer.com/ws/authorize.xiface"); // В выводе CURL http-заголовки не нужны curl_setopt($ch, CURLOPT_HEADER, 0); // Возвращать результат, а не выводить его в браузер curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // Метод http-запроса - POST curl_setopt($ch, CURLOPT_POST,1); // Что передаем? curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); // Задаем корневой сертификат для проверки curl_setopt($ch, CURLOPT_CAINFO, $CertPath); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE); // Выполняем запрос, ответ помещаем в переменную $result; $result=curl_exec($ch); if(curl_errno($ch)) echo "Curl Error number = ".curl_errno($ch).", Error desc = ".curl_error($ch)."<br>"; curl_close($ch); return $result; }

    Поместим эту функцию в самый конец нашего пока еще недописанного скрипта.

    Обратите внимание на следующие строки:

    curl_setopt($ch, CURLOPT_CAINFO, $CertPath); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE);

    Чтобы (в целях безопасностии и защиты от DNS-атак) во время сеанса CURL мог проверить валидность сертификата на сервере Login.WebMoney, мы используем аргументы CURLOPT_CAINFO и CURLOPT_SSL_VERIFYPEER. Для этого нам нужно скачать и поместить корневой сертификат сервера Login.WebMoney (WMunited.cer) куда-нибудь на свой сервер и прописать путь к нему (от корня сервера) в переменной $CertPath, которая передается аргументу CURLOPT_CAINFO.

    Также обратите внимание, что в случае возникновения ошибок при работе CURL в функции _GetAnswer() строка

    if(curl_errno($ch)) echo "Curl Error number = ".curl_errno($ch).", Error desc = ".curl_error($ch)."<br>";

    покажет номер и описание ошибки.

    Напомню, мы остановились на том, что получили XML-ответ от сервера Login.WebMoney и сохранили его в переменную $resxml. XML-ответ имеет формат:

    <response retval="" sval="" lastAccess="" expires="" />

    Что означают атрибуты единственного параметра response:

    • retval - код результата проверки тикета. 0 - если тикет существует, достоверен и срок его действия не истек.
    • sval - текстовое описание результата проверки тикета.
    • lastAccess - UTC время последнего доступа к проверяемому тикету.
    • expires - UTC время, когда срок действия проверяемого тикета истечёт.

    Из всех атрибутов нас интересует только retval. Если он равен 0, то проверка тикета завершена с положительным результатом, сам тикет достоверен и, соответственно, полученный вместе с ним WMID можно считать подтверждённым. Другие коды говорят либо об ошибках при проверке тикета, либо о том, что тикет не является подлинным.

    Итак, нам осталось дополнить код нашего php-скрипта разбором XML-ответа и получением значения retval. Это можно сделать совершенно по-разному, в зависимости от ваших предпочтений. В PHP много инструментов для XML-парсинга. Более того, поскольку ответ имеет очень простую и чёткую структуру, вытащить значение retval из него можно даже с помощью регулярных выражений. Однако, мы в своём примере воспользуемся привычной для нас и простой библиотекой SimpleXML (поддерживается только в PHP5, но не в PHP4):

    // Разбираем XML-ответ $xmlres = simplexml_load_string($resxml); if(!$xmlres) echo "Не получен XML-ответ"; $result=strval($xmlres->attributes()->retval); // Если результат не равен 0 - прерываем и выдаем ошибку if($result!=0) echo "Тикет ошибочный :("; else { echo "Тикет верный :) Вы авторизованы!<br>"; echo "Ваш WMID - ".$_POST['WmLogin_WMID']."<br>"; // Выполняем необходимые действия, // например, авторизуем пользователя, начинаем сессию и т.д. // ... }

    А это, собственно, и всё. На данный момент вы получили достоверный WMID пользователя, а сам пользователь находится на вашем сайте. Как распорядится этим богатством - решать только вам, в зависимости от вашей конкретной ситуации. Как правило, бывает необходимо либо 1) сохранить WMID пользователя в базе данных и совершить какое-то однократное действие с пользователем на сайте, либо 2) начать для этого посетителя сессию, привязав к ней WMID, для совершения дальнейших действий.

    Полностью код скрипта из нашего примера можно скачать отсюда. Как всё это работает на практике, можно проверить здесь.

    Что ещё нужно знать

    • Поговорим немного о времени жизни тикета. Если вы помните, мы устанавливали этот параметр в самом начале статьи. Мы уже говорили о том, что обычно требуется лишь одна проверка тикета. Этого достаточно для того чтобы определить, является ли тикет подлинным, и если он таковым является - начать выполнять какие-либо действия с пользователем уже на своём сайте (например, стартовать для него сессию). Постоянно проверять один и тот же тикет необходимости нет. Исходя из этих соображений рекомендуем установить в настройках время жизни тикетов минимальным, например, 1 или 2 минуты.
    • Если тикет просрочен, то Login.WebMoney вернёт retval=3. В этом случае необходимо считать тикет недостоверным и отправить пользователя на повторную авторизацию.
    • Каждая проверка тикета (XML- или SOAP-интерфейсом) продлевает срок жизни тикета. Например, если тикет создан в 20:03 и время его жизни установлено (в настройках) в 20 минут, то тикет должен "умереть" в 20:23. Если же вы сделали его проверку в течение этого периода, например, в 20:15, то время жизни автоматически продляется ещё на 20 минут, то есть до 20:35.
    • Историю тикетов, выписанных системой для ваших URL, можно посмотреть на странице История тикетов. Некоторые тикеты могут иметь время жизни меньше установленного в настройках. Это означает, что пользователь авторизовался повторно, и старый тикет, выписанный для него ранее, был принудительно "убит" системой раньше срока. То есть не может одновременно существовать более одного актуального тикета, выписанного для одного и того же WMID, авторизовавшегося на одном и том же URL.
    • Сервис поддерживает также отношения доверия между сайтами. Они подробно описаны здесь. Кратко это можно описать так. Вася может доверить тикеты своих пользователей Пете, тогда Петя сможет запрашивать статус Васиных тикетов как своих собственных. Это позволяет организовать безболезненный переход пользователей с сайта Васи на сайт Пети без повторных авторизаций. Но это уже высший пилотаж, в классических ситуациях данная функция не пригодится. Установить доверие другому сайту можно на странице Доверенные сайты. Введите в поле Фильтр адрес (можно даже часть адреса) сайта, которому хотите доверить свои тикеты. Данный сайт должен быть к тому времени уже зарегистрирован в сервисе Login.WebMoney.
    Обсудить этот материал

    23.01.2008

    Внимание! Все права на данный материал принадлежат сайту owebmoney.ru. Копирование материала разрешено с обязательным указанием гиперссылки на http://owebmoney.ru.

       Что нового почитать?
    Мой номер телефона утерян и не подлежит восстановлению. Как быть? 06.10.16 [3]
    ВОПРОС: Долго не пользовался своей симкой. Номер заблокирован, восстановлению не подлежит. Как востановить доступ к кошельку?
    Автомобилистам на заметку: как оплатить штраф по WM 04.10.16
    Сегодня мы хотим напомнить о возможностях, которые существуют в WebMoney для оплаты штрафов ГАИ и дорожных сборов. Если неприятность всё же произошла ...
    На WebMoney Merchant можно принимать Биткоины 30.09.16 [4]
    Если вы на вашем сайте принимаете 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.Главное новшест...

       Кофейня (форум)
    Проблема с Кипером WinPro версии 3.9.9.8 01.12.16
    Работает ли корректно в данный момент Х19? 30.11.16
    НБУ объяснил запрет электронных денег 08.11.16

       p2p
    Меняют 50000 WMU на 50250 UAH (курс:-0.5%) 03.12.16
    Меняют 99200 UAH на 100000 WMU (курс:-0.8%) 02.12.16
    Меняют 1000 WMZ на 26800 UAH (курс:26.8) 02.12.16

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

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


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