В предыдущей части я рассказал о восстановлении функции обновления котировок.
Следующей функцией которую хотелось восстановить является синхронизация
данных с сервером.
Для этого надо было решить две задачи: привязка файла к аккаунту с последующей аутентификацией и собственно сама синхронизация.
А так как эта тема получается очень обширной, то здесь я расскажу о решении первой части проблемы.
На тот момент портал 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-запрос следующего виде:
Значение элементов вполне понятно без объяснения.
От сервера в ответ должно придти либо сообщение об успешной авторизации:
Redirect — опциональное поле. При его наличии Money делает GET-запрос по указанному URL, но полученный результат нигде не отображается.
Либо сообщение об ошибке:
где 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-запроса следующего вида:
Пустые значения элементов означают что Money хочет получить их значения от сервера.
С первыми двумя все просто:
GUID — идентификатор основного файла Money, привязанного к аккаунту.
UserGuid — идентификатор пользователя на сервере.
А вот CryptSeed предположительно служит для ослабления ключа шифрования. Точно утверждать не берусь, т.к. применение этого параметра я не отслеживал, а явно не используется.
Ожидаемый ответ сервера вполне очевиден:
Значение параметра GUID может быть пустым, если файл к аккаунту еще не привязан. Тогда, и еще в том случае, если значение этого параметра не совпадает с идентификатором файла, то Money пошлет еще один запрос вида
для привязки файла.
Ответ сервера должен содержать тот же идентификатор.
После успешного выполнения всех действий пользователь считается авторизованным и ему предоставляется доступ к функциям программы.
Следующей функцией которую хотелось восстановить является синхронизация
данных с сервером.
Для этого надо было решить две задачи: привязка файла к аккаунту с последующей аутентификацией и собственно сама синхронизация.
А так как эта тема получается очень обширной, то здесь я расскажу о решении первой части проблемы.
На тот момент портал 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>
для привязки файла.
Ответ сервера должен содержать тот же идентификатор.
После успешного выполнения всех действий пользователь считается авторизованным и ему предоставляется доступ к функциям программы.