В предыдущей части я рассказал о восстановлении функции обновления котировок.

Следующей функцией которую хотелось восстановить является синхронизация
данных с сервером.

Для этого надо было решить две задачи: привязка файла к аккаунту с последующей аутентификацией и собственно сама синхронизация.

А так как эта тема получается очень обширной, то здесь я расскажу о решении первой части проблемы.

На тот момент портал MSN уже был центром доступа к online-сервисам Microsoft, поэтому вполне естественно что Money требовала учетную запись этого портала.

После привязки файла к аккаунту становились доступны функции по синхронизации данных между устройствами, просмотр записей транзакций online, и даже получение счетов.

Для аутентификации пользователя в Money использовался сервис Passport, и в частности его xml-протокол.

Вся процедура по аутентификации работала следующим образом.

1. По URL указанному в параметре MnyPassClientXML файла mnypass.ini Money запрашивает xml-файл (client.xml) с перечислением ссылок для доступа к сервису Passport по различным протоколам. В файле содержатся наборы ссылок сгруппированных в соответствии с доменом.

2. В соответствие со значением параметра MnyPassDefaultDomain из mnypass.ini в полученном файле выбирается запись о домене. В этой записи элемент содержит URL по которому формируется HTTP POST-запрос следующего виде:

<?xml version="1.0"?>
<LoginRequest>
	<ClientInfo name="mnypassport" version="1.35"/>
	<User>
	   <SignInName>user@mail.com</SignInName>
	   <Password>123456</Password>
	   <SavePassword>false</SavePassword>
	</User>
</LoginRequest>

Значение элементов вполне понятно без объяснения.

От сервера в ответ должно придти либо сообщение об успешной авторизации:

<LoginResponse Success="true">
<Redirect>https://moneycentral.msn.com/home.asp?did=1&t=AqHf*J!puuvpcU01kK*PA9&id=229</Redirect>
</LoginResponse>

Redirect — опциональное поле. При его наличии Money делает GET-запрос по указанному URL, но полученный результат нигде не отображается.

Либо сообщение об ошибке:

<LoginResponse Success="false"><Error Code="e5b"/></LoginResponse>

где Code одно из значений: e8a, e15, e14, e13, e12, e11, e10, e9, e4, e3, e2, e1, e8, e5b, e5a.
Расшифровка ошибок есть в файле passport.htm
Статусы HTTP ответа так же учитываются при обработке.

При получении положительного ответа пользователь считаеться авторизованным, и Money переходит к выполнению следующего шага.

3. Из файла misurls.xml берутся значения двух параметров PASSPORTURL и UPSURL.

PASSPORTURL используется для формирования GET-запроса, результаты которого более нигде не участвуют.

А вот URL из UPSURL используется для формирования POST-запроса следующего вида:

<MnyOpts><CryptSeed/><GUID/><UserGuid/></MnyOpts>

Пустые значения элементов означают что Money хочет получить их значения от сервера.

С первыми двумя все просто:

GUID — идентификатор основного файла Money, привязанного к аккаунту.
UserGuid — идентификатор пользователя на сервере.

А вот CryptSeed предположительно служит для ослабления ключа шифрования. Точно утверждать не берусь, т.к. применение этого параметра я не отслеживал, а явно не используется.

Ожидаемый ответ сервера вполне очевиден:


<MnyOptResponse>
	<CryptSeed>1234</CryptSeed>
	<GUID>56159e04-fce1-4dbc-9e8e-9ca310dc69db</GUID>
	<UserGuid>9e79710b-ca04-4b6a-b299-38bf3c33366c</UserGuid>
</MnyOptResponse>

Значение параметра GUID может быть пустым, если файл к аккаунту еще не привязан. Тогда, и еще в том случае, если значение этого параметра не совпадает с идентификатором файла, то Money пошлет еще один запрос вида


<MnyOpts>
	<GUID>56159e04-fce1-4dbc-9e8e-9ca310dc69db</GUID>
</MnyOpts>

для привязки файла.

Ответ сервера должен содержать тот же идентификатор.

После успешного выполнения всех действий пользователь считается авторизованным и ему предоставляется доступ к функциям программы.

Комментарии (0)