Метод Spotipy prompt_for_user_token
предоставляется как быстрый и грязный метод, позволяющий кому-либо, использующему модуль локально, приступить к работе и не предназначен для того, чтобы быть кодом, который должен быть построен непосредственно, если вы хотите, чтобы произвольные пользователи моглиаутентифицировать себя через веб-сайт.Поскольку у вас есть приложение Flask, вероятно, оно и ваш код Spotipy взаимодействуют напрямую через импорт, а не через каналы и стандартный ввод / вывод.
Некоторые вещи, на которые следует обратить внимание:
- Flask-Login , если вы хотите управлять пользователями, входящими на веб-сайт
- Альтернативные методы передачи аутентификации на
spotipy.Spotify
, кроме простого токена доступа (менеджер учетных данных клиента или requests
)сессия).Эти другие методы позволяют клиенту Spotipy обновлять токен доступа, если он истекает в середине использования, обрабатывать пользовательские аннулирования и т. Д. - request-oauth2 (обратите внимание, что это только один из многих OAuth2Python любит и, возможно, не самый лучший), что делает все средства авторизации немного более удобными и позволяет сделать что-то вроде:
# import Flask things, requests-oauth2,
from requests_oauth2 import OAuth2
from spotipy import Spotify
from flask import redirect
spotify_auth = OAuth2(
client_id=os.environ["SPOTIFY_CLIENT_ID"],
client_secret=os.environ["SPOTIFY_CLIENT_SECRET"],
redirect_uri=f"http://{os.environ['HOST_NAME']}/authorize",
site="https://accounts.spotify.com",
authorization_url="/authorize",
token_url="/api/token",
scope_sep=" "
)
# and then use this url as a link within a public login view
spotify_auth.authorize_url(
scope=["user-read-recently-played", "user-top-read"],
response_type="code"
)
# and have an authorize route that can direct you to Spotify or handle you being redirected back here from Spotify
@app.route('/authorize')
def authorize():
error = request.args.get("error")
if error:
abort(404)
code = request.args.get("code")
if code:
data = spotify_auth.get_token(
code=code,
grant_type="authorization_code",
)
access_token = data["access_token"]
refresh_token = data["refresh_token"]
scopes = data["scope"].split()
spotify_client = spotipy.Spotify(auth=access_token)
else:
return redirect(spotify_auth.authorize_url(
scope=["user-read-recently-played", "user-top-read"],
response_type="code",
state=session['state']
))
При первом посещении /authorize
этоперенаправит пользователя на страницу входа в Spotify.Но когда пользователь успешно входит в систему, он перенаправляет пользователя обратно на сайт Flask (обратно к /authorize
), а не выполняет копирование / вставку части prompt_for_user_token()
.
, как только он снова включается./authorize
, на этот раз есть параметр запроса code
, поэтому он делает запрос клиента-поставщика OAuth2 на преобразование этого кода в токены доступа для вас.
И этот, и prompt_for_user_token
следуюттот же подход:
- Получите URL-адрес авторизации Spotify, чтобы направить пользователя на вход в
- Обработка перенаправления из Spotify Login - Flask делает это, получая входные данные от URL-адреса, на который перенаправляет Spotifyи
prompt_for_user_token
делает это путем копирования / вставки URL-адреса с несуществующей веб-страницы. - Выполните вызов для преобразования кода в доступ и обновления токенов для пользователя.
Возможно, я немного убил этот код, потому что он выбран из моей старой реализации Flask моей интеграции Spotify.Вот более полная суть , но я почти уверен, что многие вещи SQLAlchemy, представление авторизации, довольно плохие, так что возьмите это с щепоткой соли.