Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Новая система авторизации #414

Closed
MarshalX opened this issue Feb 27, 2021 · 9 comments
Closed

Новая система авторизации #414

MarshalX opened this issue Feb 27, 2021 · 9 comments
Assignees
Labels
feature Новая функция или улучшение старой
Milestone

Comments

@MarshalX
Copy link
Owner

Начало: #375 (comment)

@MarshalX MarshalX added the feature Новая функция или улучшение старой label Feb 27, 2021
@MarshalX MarshalX self-assigned this Feb 27, 2021
@MarshalX
Copy link
Owner Author

MarshalX commented Feb 27, 2021

Разлогин

Raw request:

POST https://api.music.yandex.net/push/update-token HTTP/1.1
Host:api.music.yandex.net
Accept:*/*
X-Yandex-Music-Content-Type:adult
X-Yandex-Music-Client-Now:2021-02-27T14:45:13.459Z
Accept-Encoding:gzip, deflate, br
Accept-Language:en
Content-Type:application/x-www-form-urlencoded
X-Yandex-Music-Device:os=iOS; os_version=14.0; manufacturer=Apple; model=iPad8,1; clid=0; device_id=лупа-D121-4963-AD0C-B06DB0BB3A49; uuid=пупа
Content-Length:12
User-Agent:Maple/518 (iPad; iOS 14.0; Scale/2.00)
X-Yandex-Music-Client:YandexMusic/518
Ya-Client-User-Agent:Maple/518 (iPad; iOS 14.0; Scale/2.00)
Connection:keep-alive

platform=ios

Ответ:

{
  "invocationInfo": {
    "hostname": "music-stable-back-vla-21.vla.yp-c.yandex.net",
    "req-id": "fsd-2822510382015228105",
    "exec-duration-millis": "2"
  },
  "result": "ok"
}

@MarshalX
Copy link
Owner Author

MarshalX commented Feb 27, 2021

Запрос поле ввода логина (шаг 1)

Raw request:

POST https://mobileproxy.passport.yandex.net/2/bundle/mobile/start/?app_id=ru.yandex.mobile.music&uuid=некаяМагияМожетИдПриложения&app_version_name=5.18&ifv=пупа-D121-4963-AD0C-B06DB0BB3A49&am_version_name=5.151&deviceidhash=42342344311323651460&manufacturer=Apple&deviceid=пупа-D121-4963-AD0C-B06DB0BB3A49&device_name=мойАйпад&device_id=пупа-D121-4963-AD0C-B06DB0BB3A49&app_platform=iPad&model=iPad8%2C1 HTTP/1.1
Host:mobileproxy.passport.yandex.net
Content-Type:application/x-www-form-urlencoded; charset=utf-8
Connection:keep-alive
Accept:*/*
User-Agent:com.yandex.mobile.auth.sdk/5.151.68904 (Apple iPad8,1; iOS 14.0)
Accept-Language:en-PL;q=1, ru-PL;q=0.9
Accept-Encoding:gzip, deflate, br
Content-Length:298

client_id=23cabbbdc6cd418abb4b39c32c41195d&client_secret=53bc75238f0c4d08a118e51fe9203300&display_language=en&login=<LOGIN>&payment_auth_retpath=yandexmusic%3A%2F%2Fam%2Fpayment_auth&x_token_client_id=c0ebe342af7d48fbbbfcf2d2eedb8f9e&x_token_client_secret=ad0a908f0aa341a182a37ecd75bc319e

x_token_client_id, x_token_client_secret, client_id, client_secret - константы

Ответ:

{
  "primary_alias_type": 7,
  "magic_link_email": "i***a@marshal.dev",
  "can_authorize": true,
  "status": "ok",
  "auth_methods": [
    "password",
    "magic_link"
  ],
  "track_id": "845fe936нуВотТутЧто-тоДа3fd3793593e0d"
}

Если ввели инвалидный логин (который не зареган, например), то получаем такой ответ:

{
  "status": "error",
  "lite_data_necessity": {
    "phone_number": "optional",
    "password": "optional",
    "name": "optional"
  },
  "errors": [
    "account.not_found"
  ],
  "account_type": "lite",
  "allowed_account_types": [
    "lite"
  ],
  "can_register": true,
  "login": "мусорКоторыйВвели",
  "track_id": "некаяДичь"
}

@MarshalX
Copy link
Owner Author

MarshalX commented Feb 27, 2021

Отправка пароля к логину из шага 1. Используется track_id из ответа на прошлый запрос

Raw request:

POST https://mobileproxy.passport.yandex.net/1/bundle/mobile/auth/password/ HTTP/1.1
Host:mobileproxy.passport.yandex.net
Content-Type:application/x-www-form-urlencoded; charset=utf-8
Connection:keep-alive
Accept:*/*
User-Agent:com.yandex.mobile.auth.sdk/5.151.68904 (Apple iPad8,1; iOS 14.0)
Accept-Language:en-PL;q=1, ru-PL;q=0.9
Accept-Encoding:gzip, deflate, br
Content-Length:68

password=мойМегаПароль&track_id=нуИтутИзОтвета

В ответе жирный и вкусный объект

{
  "status": "ok",
  "access_token_expires_in": 31536000,
  "public_id": "1f2dz0fdcbw55436hg69c44gkjr",
  "uid": 5043696,
  "firstname": "Il`ya",
  "lastname": "Semyonov",
  "x_token_expires_in": 31536000,
  "cloud_token": "cl-e3d89c56c52a379a9ec673956d4",
  "birthday": "мояДата",
  "has_password": true,
  "primary_alias_type": 7,
  "x_token": "выглядитКакОбычныйТокенЧтоИспользуетсяСейчас",
  "display_name": "вМоёмСлучаеМыло",
  "access_token": "оченьСтранныйВформатеТокенНаКоторыйНамНасрать",
  "gender": "m",
  "normalized_display_login": "моёМыло",
  "x_token_issued_at": 1614437527,
  "display_login": "иЕщёМоёМыло",
  "public_name": "Il`ya S.",
  "avatar_url": "https://avatars.mds.yandex.net/get-yapic/67401/рандом/normal",
  "native_default_email": "моёБыло"
}

Если не тот пароль

{
  "status": "error",
  "errors": [
    "password.not_matched"
  ]
}

Капча появилась на 6 раз

Ответ с капчей:

{
  "status": "error",
  "errors": [
    "captcha.required"
  ],
  "captcha_image_url": "https://ext.captcha.yandex.net/image?key=нуПупаНекая"
}

Для ввода капчи запрос повторяется, но добавляется заголовок captcha_answer с ответом на капчу. Если капча вновь инвалид, ответ не отличается от запроса капчи в первый раз.

@MarshalX
Copy link
Owner Author

Последний шаг. Получение токена для ЯМ по x-token из прошлого шага.

POST https://mobileproxy.passport.yandex.net/1/token?app_id=ru.yandex.mobile.music&uuid=опятьМусор&app_version_name=5.18&ifv=пупа-D121-4963-AD0C-B06DB0BB3A49&am_version_name=5.151&deviceidhash=мусор&manufacturer=Apple&deviceid=пупа-D121-4963-AD0C-B06DB0BB3A49&device_name=айпад&device_id=пупа-D121-4963-AD0C-B06DB0BB3A49&app_platform=iPad&model=iPad8%2C1 HTTP/1.1
Host:mobileproxy.passport.yandex.net
Content-Type:application/x-www-form-urlencoded; charset=utf-8
Connection:keep-alive
Accept:*/*
User-Agent:com.yandex.mobile.auth.sdk/5.151.68904 (Apple iPad8,1; iOS 14.0)
Accept-Language:en-PL;q=1, ru-PL;q=0.9
Accept-Encoding:gzip, deflate, br
Content-Length:220

access_token=<X-TOKEN>&client_id=23cabbbdc6cd418abb4b39c32c41195d&client_secret=53bc75238f0c4d08a118e51fe9203300&grant_type=x-token&payment_auth_retpath=yandexmusic%3A%2F%2Fam%2Fpayment_auth

В ответе уже привычный объект из старой реализации

{
  "access_token": "ноТокенОченьСтрашныйИзНесколькихЧастейДажеПримерНеДам",
  "expires_in": 31536000,
  "token_type": "bearer",
  "uid": мойИд
}

@MarshalX
Copy link
Owner Author

MarshalX commented Feb 27, 2021

Дальше этот страшный токен используется как обычно в Authorization: OAuth нуИВотТутЭтаЖесть

Из плюшек есть ещё такой метод:

GET https://mobileproxy.passport.yandex.net/1/bundle/account/short_info?avatar_size=islands-200 HTTP/1.1
Host:mobileproxy.passport.yandex.net
Ya-Consumer-Authorization:OAuth пупецПолный
Accept:*/*
User-Agent:com.yandex.mobile.auth.sdk/5.151.68904 (Apple iPad8,1; iOS 14.0)
Accept-Language:en-PL;q=1, ru-PL;q=0.9
Accept-Encoding:gzip, deflate, br
Connection:keep-alive

В ответе жирный объект как тут #414 (comment)

@MarshalX
Copy link
Owner Author

Необходимо изучить работу с 2FA.

В моей реализации почему-то не принимает ответ на капчу. Не могу понять почему

@MarshalX
Copy link
Owner Author

MarshalX commented Feb 27, 2021

Чтобы получить новую версию токена необходимо добавить обязательные 3 GET параметра в последний запрос (/token) с определёнными значениями. На остальные не роляет (в start можно не добавлять).

Из всей груды мусора в параметрах новый тип токена можно получить передав только следующие:

?app_id=ru.yandex.mobile.music&app_version_name=5.18&app_platform=iPad

@MarshalX
Copy link
Owner Author

Необходимо изучить работу с 2FA.

В моей реализации почему-то не принимает ответ на капчу. Не могу понять почему

Обработка капчи исправлена. Работа с 2FA как и в старой авторизации. Вместо пароля используется OTP из приложения Яндекс

@MarshalX
Copy link
Owner Author

Неактуально. Они вновь всё переделали и стало ещё хуже

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature Новая функция или улучшение старой
Projects
None yet
Development

No branches or pull requests

1 participant