Skype

Для удобства программного взаимодействия с различными сервисами человечество придумало множество различных протоколов, начиная от PLAIN и заканчивая всякими REST, SOAP и прочими. Но компания Microsoft, как ей и свойственно, берёт RFC, пытается его читать, не осиливает и реализует свой собственный протокол, который называет так же, как и в RFC, но не реализует базовый функционал протокола, чтобы, видимо, запутать сторонних разработчиков.

Здесь мы будем пытаться разобраться как же устроена авторизация в Skype и попутно попробуем написать модуль для bitlbee, чтобы пользоваться этим скайпом в более удобоваримой форме, нежели табом в браузере (который, кстати, через пару суток съедает солидный кусок памяти)

Предтечи

Всё начинается с того, что мы читаем документацию по авторизации. Протокол OAuth2, ничего сложного, мы ему SOAP, он нам. Однако все попытки приводят либо к ошибкам авторизации, либо к ошибкам сервера. RFC упорно твердит, что должно работать так, так и никак иначе, а сервера Microsoft рассказывают, что RFC врёт.

Что ж, с первого захода не получается и мы идём на поиски уже существующих реализаций и находим:

В целом я выбрал две, чтобы видеть общую картину и, возможно, найти более удобный способ на основе двух реализаций, однако что бы там не утверждала документация microsoft в целом и skype в частности авторизация имеет всего один путь:

  • Получаем первую пачку cookie от https://login.skype.com/login/oauth/microsoft?client_id=578134 (MSPOK, MSPRequ)
  • После получения парсим страничку, чтобы из HTML получить нужный токен (regex для получения '<input.*?name=\“PPFT\”.*?value=\“(.*?)\”')
  • Второй шаг, отправляем полученные cookie POST'ом на https://login.live.com/ppsecure/post.srf?wa=wsignin1.0&wp=MBI_SSL&wreply=https://lw.skype.com/login/oauth/proxy?client_id=578134&site_name=lw.skype.com&redirect_uri=https:%3A%2F%2Fweb.skype.com%2F с нашими данными login=<login>&passwd=<password>&PPFT=<token>
  • Получаем вторую итерацию авторизационных данных, а дальше у нас два пути:
    • Либо приедет ошибка, что “Вы авторизуетесь из необычного места, введите последние 4 цифры номера” - это лечится авторизацией через браузер и в настройках аккаунта подтверждением, что это именно вы
    • Либо всё будет хорошо и мы получаем ещё один токен для авторизации, который надо отгрепать из HTML (regex 'id=\“t\” value=\“(.*?)\”>')
  • И, по идее, последним шагом авторизации идёт отправка POST'ом всех полученных данных на https://web.skype.com/microsoft?client_id=578134&redirect_url=https://web.skype.com (t=<t-token>&client_id=578134&oauthPartner=999&site_name=lw.skype.com&redirect_uri=https://web.skype.com)
  • Если всё успешно, то на полученной страничке можно отгрепать вожделенный skypetoken, а так же количество секунд, через которое он заэкспайрится.

Казалось бы, ну сделай ты банальный JSON с тремя-четыремя методами для авторизации, дак нет - мы страдаем и все остальные должны. А самое забавное, что после получения токена можно спокойно работать с API по JSON, т.е. получается, что Skype-то сам по себе не так уж и плох, просто очередные попытки привязать к своей ущербной системе авторизации чужие разработки создают огромные проблемы.