OAuth2 Яндекс на Flask

Рейтинг: 1Ответов: 1Опубликовано: 02.02.2023

В документации явно проблемы с последовательностью...

Во-общем,

  1. Создал приложение в личном кабинете. Указал в поле "Callback URI" - где буду ловить ответ (redirect_uri)

  2. Скачал и поставил на сайт кнопку "Войти через Яндекс". На кнопку поставил ссылку:

    link_yandex_auth = f'https://oauth.yandex.ru/authorize?response_type=token&client_id={client_id}&' \
                  f'redirect_uri={redirect_uri}&login_hint={login_hint}&scope={scope}&'\
                  f'force_confirm=yes&display=popup'
    

    login_hint - указал email

    scope - указала права, указанные при создании приложения

  3. Пытаюсь поймать токен на странице redirect_uri, но он приходит в адресной строке после знака #, соответственно через request.values.get() он не достается (если бы был не # а ?, то достал бы)

  • Соответственно взяв из документации js-скрипт:
var token = /access_token=([^&]+)/.exec(document.location.hash)[1];

Он достается, но лежит теперь уже на странице и соответственно в роутах Flask к нему нет доступа, а как мне его закидывать в заголовок и отправлять на

https://login.yandex.ru/info?format=json&with_openid_identity=yes

чтобы взять email пользователя?

Может, что-то я не так делаю?

Ответы

▲ 0

Да, всё верно, нужно делать два запроса. Из документации это не сразу видно, так как нет сжатого описания "как это работает", а сразу длинные портянки подробного описания.

Правда мои шаги относятся не к Flask а к RubyOnRails, но кажется суть в том-же...

Первый шаг - Достигается подключением скрипта sdk-suggest.js на странице где показываем кнопку яндекса (или виджет). Происходит вызов пользователем страницы https://Redirect.URI/для/веб/сервисов#access_token=ACCESS_TOKEN&token_type=bearer&expires_in=123456789

Второй шаг - Достигается подключением скрипта sdk-suggest-token.js на странице https://Redirect.URI/для/веб/сервисов#... Этот скрипт, если я правильно понял, должен отработать и отправить запрос на наш бэк и сразу закрыть это всплывающее окно.