python: как перенаправить из настольного приложения на URL-адрес, подождать, пока пользователь примет авторизацию, и получить код авторизации - PullRequest
0 голосов
/ 13 июля 2020

Я работаю над приложением, использующим Spotify API, но я немного новичок во всем этом. Я пытаюсь получить код авторизации с помощью Proof Key for Code Exchange (PKCE) (https://developer.spotify.com/documentation/general/guides/authorization-guide/#authorization -code-flow-with-proof-key-for-code-exchange-pkce ) Моя проблема в как перенаправить пользователя в query, где он должен ПРИНЯТЬ авторизацию и заставить мое приложение ждать, пока пользователь не нажмет ПРИНЯТЬ. Когда он это сделает, пользователь будет перенаправлен, и этот новый URL-адрес (как сказано в документации) будет содержать код авторизации, который мне нужен, чтобы затем обменять его на токен авторизации.

Это моя функция, пока получите этот код авторизации:

def get_auth_code(self):
    code_challenge = self.get_code_challenge_PKCE()
    scopes_needed = "user-read-email%20user-read-private%20playlist-read-collaborative%20playlist-modify-public%20playlist-read-private%20playlist-modify-private%20user-library-modify%20user-library-read"

    endpoint = "https://accounts.spotify.com/authorize"
    query = f"{endpoint}?client_id={self.client_ID}&response_type=code&redirect_uri={self.redirect_uri}&scope={scopes_needed}&code_challenge_method=S256&code_challenge={code_challenge}"
    webbrowser.open(query)

1 Ответ

0 голосов
/ 16 июля 2020

Настройте веб-сервер.

Чтобы программно извлечь токены доступа, вам понадобится веб-сервер для обработки перенаправления после входа пользователя в Spotify (на который вы его перенаправили). Теперь этот сервер может быть пользователем, вставляющим URI в поле ввода на терминале, но, очевидно, это не идеально для взаимодействия с пользователем. Это оставляет место для множества ошибок.

Я создал клиент Spotify Web API, внутреннее устройство которого может быть полезно для вас. Например, , вы можете использовать Flask для создания сервера. Основной принцип заключается в использовании одной конечной точки (например, /login) для перенаправления (код 307 работал у меня, браузеры не запомнили его) пользователя на обратный вызов (например, /callback), который получает параметр code, с которым вы можете запросить токен доступа.

OAuth2 может быть немного проблематичным для локальной реализации, я знаю. В моей библиотеке я также сделал аналогичную функцию , которую вы создаете с использованием webbrowser, но у нее есть особенность ручного копирования и вставки. Чтобы использовать функции, вы можете определить себя для краткости, суть:

verifier = secrets.token_urlsafe(32)  # for PKCE, not in my library yet
url = user_authorisation_url(scope, state, verifier)

# Communicate with the user
print('Opening browser for Spotify login...')
webbrowser.open(url)
redirected = input('Please paste redirect URL: ').strip()

code = parse_code_from_url(redirected)
state_back = parse_state_from_url(redirected)
assert state == state_back  # For that added security juice
token = request_user_token(code, verifier)
...