|
|
|||||||
|
Login.WebMoney: авторизуем, выводим из сумрака© Никита Сенченко ![]() ![]() ![]() ![]() ![]() ![]() ![]() ВведениеКоличество сетевых проектов, связавших свой бизнес с WebMoney, растёт изо дня в день. Клиенты этих проектов одновременно являются пользователями WMT, и часто возникает необходимость точно их идентифицировать и получать достоверные WMID. Например, обменный пункт внедряет бонусную программу и хочет привязать размер скидки к конкретному WM-идентификатору (это разумно, поскольку обычный логин, на который начисляется скидка, пользователи смогут свободно передавать друг другу, тем самым обманывая обменник). Другой пример: кредитный сервис, автоматизировавший выдачу WM-кредитов, желает авторизовывать кредиторов на своём сайте и точно определять их WMID, так как это очень важно для снижения рисков. А вот еще: некий сайт проводит розыгрыш подарков среди пользователей WebMoney, для чего ему необходимо определять и сохранять их WM-идентификаторы, так как WMID являтся единственным, что однозначно идентифицирует пользователя WebMoney, как номер паспорта однозначно идентифицирует человека. Подобных примеров можно привести массу. Ранее для авторизации WebMoney-пользователей на своём сайте нужно было программировать непростой интерфейс X7 для входа по Keeper Classic и даже особым образом настраивать веб-сервер для входа по сертификату Keeper Light (Эти способы, впрочем, никто не отменял, и так организовывать аутентификацию на своём сайте можно и сейчас.) Не говоря уже о том, что авторизация с помощью системы Enum и авторизация для пользователей GSM Кипера вообще была недоступна для владельцев сайтов. Поэтому специально для упрощения данной задачи разработчики WebMoney предложили сервис Login.WebMoney, который все эти проблемы решает и с которым мы сейчас познакомимся. Принцип работы сервиса Login.WebMoneyLogin.WebMoney работает по следующему принципу. Допустим, ваш сайт должен авторизовать какого-то WebMoney-пользователя, то есть определить его WMID. Для этого он просто направляет его на специальную страницу сервиса Login.WebMoney, где пользователь и проходит авторизацию, выбирая любой удобный для него способ: Keeper Classic, Light, Enum или GSM Keeper. То есть реально авторизуете пользователя не вы, а система WebMoney. Далее Login.WebMoney генерирует тикет - уникальный сессионный ключ, состоящий из символов и удовлетворяющий регулярному выражению Рассмотрим теперь всё это на конкретном примере и покажем, как это можно запрограммировать. Напомним, перед нами стоит задача: получить достоверный WMID пользователя и тем самым авторизовать его на своём сайте. Предварительные настройкиИдём на login.wmtransfer.com (если нужно - принудительно переключаем язык с английского на русский в верхнем правом углу). Жмём Войти, авторизуемся. Нажимаем пункт меню Сайт. Здесь задаём основные настройки, а именно: Идём в раздел 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В тот момент, когда вам нужно авторизовать пользователя, вы отправляете его по адресу Кстати, сайт 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_Ticket и WmLogin_WMID. Первый содержит тикет (напомним, тикет - это уникальный неповторяющийся сессионный пароль), а второй содержит WMID пользователя. Понятно, что любой злоумышленник может сымитировать отправку на ваш URL такой формы с вымышленным тикетом и WMID. Поэтому вы не должны принимать всё за чистую монету и должны обязательно проверять достоверность получаемых тикетов. Но этим мы займёмся чуть позже, а пока напишем простой код на PHP, который будет по формальным признакам отсекать ложные вызовы, поступающие на наш URL, уже на этом этапе. "; // Продолжаем выполнение скрипта // ... } 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-ответ с результатами проверки. Запрос должен иметь следующий формат: Что должно передаваться в этих параметрах:
Формируем XML-запрос: Запрос нужно отправлять методом POST, поэтому будем использовать библиотеку libcurl (CURL). Как правило, она включена в сборку PHP даже на недорогих виртуальных хостингах. Проверить, включена ли поддержка CURL на вашем сервере, можно с помощью функции Напишем функцию _GetAnswer(), которая будет получать на вход наш XML-пакет с запросом, отправлять его на сервер Login.WebMoney, используя CURL, и получать ответ, отдавая этот ответ на выходе. "; curl_close($ch); return $result; } Поместим эту функцию в самый конец нашего пока еще недописанного скрипта. Обратите внимание на следующие строки: Чтобы (в целях безопасностии и защиты от DNS-атак) во время сеанса CURL мог проверить валидность сертификата на сервере Login.WebMoney, мы используем аргументы CURLOPT_CAINFO и CURLOPT_SSL_VERIFYPEER. Для этого нам нужно скачать и поместить корневой сертификат сервера Login.WebMoney (WMunited.cer) куда-нибудь на свой сервер и прописать путь к нему (от корня сервера) в переменной $CertPath, которая передается аргументу CURLOPT_CAINFO. Также обратите внимание, что в случае возникновения ошибок при работе CURL в функции _GetAnswer() строка "; покажет номер и описание ошибки. Напомню, мы остановились на том, что получили XML-ответ от сервера Login.WebMoney и сохранили его в переменную $resxml. XML-ответ имеет формат: Что означают атрибуты единственного параметра response:
Из всех атрибутов нас интересует только retval. Если он равен 0, то проверка тикета завершена с положительным результатом, сам тикет достоверен и, соответственно, полученный вместе с ним WMID можно считать подтверждённым. Другие коды говорят либо об ошибках при проверке тикета, либо о том, что тикет не является подлинным. Итак, нам осталось дополнить код нашего php-скрипта разбором XML-ответа и получением значения retval. Это можно сделать совершенно по-разному, в зависимости от ваших предпочтений. В PHP много инструментов для XML-парсинга. Более того, поскольку ответ имеет очень простую и чёткую структуру, вытащить значение retval из него можно даже с помощью регулярных выражений. Однако, мы в своём примере воспользуемся привычной для нас и простой библиотекой SimpleXML (поддерживается только в PHP5, но не в PHP4): "; echo "Ваш WMID - ".$_POST['WmLogin_WMID']." "; // Выполняем необходимые действия, // например, авторизуем пользователя, начинаем сессию и т.д. // ... } А это, собственно, и всё. На данный момент вы получили достоверный WMID пользователя, а сам пользователь находится на вашем сайте. Как распорядится этим богатством - решать только вам, в зависимости от вашей конкретной ситуации. Как правило, бывает необходимо либо 1) сохранить WMID пользователя в базе данных и совершить какое-то однократное действие с пользователем на сайте, либо 2) начать для этого посетителя сессию, привязав к ней WMID, для совершения дальнейших действий. Полностью код скрипта из нашего примера можно скачать отсюда. Как всё это работает на практике, можно проверить здесь. Что ещё нужно знать
![]() 23.01.2008 Внимание! Все права на данный материал принадлежат сайту owebmoney.ru. Копирование материала разрешено с обязательным указанием гиперссылки на http://owebmoney.ru. |
|
Все права на материалы, опубликованные на owebmoney.ru, охраняются в соответствии с законом об авторском праве. Разрешено копирование без согласования при условии указания гиперссылки на сайт (без атрибута nofollow и сокрытий) непосредственно до\после материала.
|
|