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

Аутентификация по паролю, логину и challenge* через API(passport.yandex.ru) #601

Open
andronix1 opened this issue May 29, 2023 · 5 comments

Comments

@andronix1
Copy link

andronix1 commented May 29, 2023

1. Получаем csfr_token и process_uuid из страницы HTML
GET https://passport.yandex.ru/am?app_platform=android
2. Получаем tracks id и проверяем имя пользователя
POST https://passport.yandex.ru/registration-validations/auth/multi_step/start
Тело запроса (form-urlencoded):

  • csrf_token: пункт 1
  • process_uuid: пункт 1
  • login: имя пользователя
  • app_platform: у меня работает только с "android"

Ответ (json):
Если верно:

  • is_rfc_2fa_enabled: двухфакторная аутентификация. Не разобрана здесь. Скорее всего включена в challenge
  • track_id: id трека, потребуется позже
  • can_authorize: true
  • auth_methods: доступные методы. Из приложения: magic_link, neo_phonish_restore, otp(не знаю), password, sms_code, social_fb(facebook), social_gg(google), social_mr(mail ru), social_ok(odnoklassniki), social_tw(twitter), social_vk(vk)
  • preferred_auth_method: предпочитаемый метод из auth_methods
    Если неверно:
  • can_register: true

3. Проверяем пароль
POST https://passport.yandex.ru/registration-validations/auth/multi_step/commit_password
Тело запроса (form-urlencoded):

  • csrf_token: пункт 1
  • track_id: пункт 2
  • password: пароль

Ответ (json):
Если верно:

  • status: ok
  • state: auth_challenge, если нужно подтвердить пароль. Если не надо, то параметр state отсутствует

4. challenge
В данном случае подтверждение телефона
4.1. POST https://passport.yandex.ru/registration-validations/auth/challenge/submit
Тело запроса (form-urlencoded):

  • csrf_token: пункт 1
  • track_id: пункт 2
    Ответ (json):
  • challenge:
    • challengeType: тип. В данном случае phone_confirmation(в приложении вроде только он и есть)
    • hint: телефон с замазанными цифрами
    • fieldValue: у меня пусто
    • errorText:
    • errorCode:
    • isSms2faChallenge: двухфакторная аутентификация или просто проверка телефона
    • phoneId: цифровой id телефона. Потребуется позже

4.2. POST https://passport.yandex.ru/registration-validations/auth/validate_phone_by_id
Тело запроса (form-urlencoded):

  • csrf_token: пункт 1
  • track_id: пункт 2
  • phoneId: пункт 4.1
    Ответ (json):
  • valid_for_call:
  • valid_for_flash_call:
  • id: нигде больше не нужен

4.3. POST https://passport.yandex.ru/registration-validations/phone-confirm-code-submit
Тело запроса (form-urlencoded):

  • csrf_token: пункт 1
  • track_id: пункт 2
  • phoneId: пункт 4.1
  • confirm_method: by_sms. Из приложения: by_call, by_flash_call
    Ответ (json):
  • deny_resend_until: int
  • code_length: количество цифр в коде
  • global_sms_id: нигде не фигурирует. Даже в приложении
  • number: номер телефона в различных форматах
    • masked_e164: "+7xxx*****xx",
    • masked_original: "+7xxx*****xx",
    • masked_international: "+7 xxx *--xx"
  • track_id: дубликат(2)
  • id: дубликат(4.2)
  • now: timestamp текущего времени в формате str

4.4. POST https://passport.yandex.ru/registration-validations/phone-confirm-code
Тело запроса (form-urlencoded):

  • csrf_token: пункт 1
  • track_id: пункт 2
  • code: код из sms сообщения
    Ответ (json):
  • number: номер телефона в различных форматах(см п. 4.3)
  • id: дубликат(см п. 4.3)

4.5. POST https://passport.yandex.ru/registration-validations/auth/challenge/commit
Тело запроса (form-urlencoded):

  • csrf_token: пункт 1
  • track_id: пункт 2
  • challenge: тип. Берётся из п. 4.1(challenge.challengeType)

5. Не знаю, обязательно ли. У меня работает без него
GET https://passport.yandex.ru/auth/finish/?track_id=43ba9a40a5639d48ba60707186c86afe7a

6. Получение токена
POST https://mobileproxy.passport.yandex.net/1/bundle/oauth/token_by_sessionid
Тело запроса (form-urlencoded):

  • client_id: c0ebe342af7d48fbbbfcf2d2eedb8f9e
  • client_secret: ad0a908f0aa341a182a37ecd75bc319e
  • track_id: пункт 2
    Также надо указать в headers:
  • ya-client-host: passport.yandex.ru
  • ya-client-cookie: cookie Session_id из passport.yandex.ru
    Ответ (json):
  • access_token: токен
  • token_type: bearer
  • expires_in: когда истекает
@andronix1
Copy link
Author

Поправка:
Токен в другом виде. Для его получения надо:
7. POST https://mobileproxy.passport.yandex.net/1/token?app_platform=android
Тело запроса (form-urlencoded):
client_id: 23cabbbdc6cd418abb4b39c32c41195d // ОТЛИЧАЕТСЯ ОТ ПУНКТА 6
client_secret: 53bc75238f0c4d08a118e51fe9203300 // ОТЛИЧАЕТСЯ ОТ ПУНКТА 6
access_token: пункт 6
grant_type: x-token
В headers не надо указывать куки, как в пункте 6
Ответ (json):
access_token: токен
token_type: bearer
expires_in: когда истекает
uid: id пользователя

@andronix1
Copy link
Author

Не требует User-Agent или x-yandex-music-client для работы

@Mezigore
Copy link

Mezigore commented Jul 18, 2023

4.3. POST https://passport.yandex.ru/registration-validations/phone-confirm-code-submit Тело запроса (form-urlencoded):

  • csrf_token: пункт 1
  • track_id: пункт 2
  • phoneId: пункт 4.1
  • confirm_method: by_sms. Из приложения: by_call, by_flash_call

403 Forbidden - в чем может быть дело. все до этого момента работало. запрашиваю by_sms

До этого приходило

challenge: {
challengeType: "mobile_id",
availableChallenges: [mobile_id, phone_confirmation]

может в этом дело?

@andronix1
Copy link
Author

@Mezigore
Возможно я уже поздно, но на всякий случай отвечу :)
Возможно изменён способ дополнительной аутентификации на аккаунте. У меня вроде пока всё работает.
Можно посмотреть трафик в https://passport.yandex.ru/auth. Это ссылка, по которой работает аутентификация в приложении

@MarshalX
Copy link
Owner

Спасибо!

Все варианты с получением токена были вынесены в отдельный репозиторий https://github.com/MarshalX/yandex-music-token

Мы можем сконвертировать данное issue в обсуждение. В рамках этой библиотеки реализовано не будет

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
3 participants