Spotify 身份验证流程 (Spotify API)
Posted
技术标签:
【中文标题】Spotify 身份验证流程 (Spotify API)【英文标题】:Spotify Authentication Flow (Spotify API) 【发布时间】:2020-07-05 09:01:17 【问题描述】:我正在尝试允许用户使用 Spotify 登录(使用 Spotipy 库),以便为在他们的帐户上创建播放列表和填充播放列表提供身份验证。用户登录后,我将通过嵌入式 Spotify 播放器(使用新创建的播放列表的播放列表 ID)在重定向模板中显示他们刚刚创建的播放列表。
我的 html 模板中有一个表单输入框,它接受用户(他们的 Spotify 用户名)的输入。我还有一个 Spotify URI 列表,用于准备填充播放列表的曲目。
我关注Spotipy's documentation 获取用户身份验证令牌,如下所示(我已删除我的客户端 ID 和密码)。我不确定它为什么不起作用:
import os
import spotipy
import spotipy.util as util
from json.decoder import JSONDecodeError
from datetime import date
@login_required
def save_playlist(request, data='Default_Data'):
username = data.split('/')[0] #spotify username
track_ids = data.split('/')[1:11] #list of spotify IDs for playlist tracks
client_id = '****'
client_secret = '****'
scope = 'playlist-modify-public, playlist-modify-private'
redirect_uri = 'http://127.0.0.1:8000/save_playlist/'
#check if username is already in cache, if not, create cache
try:
token = util.prompt_for_user_token(username,
scope=scope,client_id=client_id,
client_secret=client_secret,redirect_uri=redirect_uri)
except (AttributeError, JSONDecodeError):
os.remove(f".cache-username")
token = util.prompt_for_user_token(username,
scope=scope,client_id=client_id,
client_secret=client_secret,redirect_uri=redirect_uri)
sp=spotipy.Spotify(auth=token)
today = date.today()
date_string = (str(today.day) + ' - ' + str(today.month) + ' - ' + str(today.year))
#playlist title
playlist_name = f"GENIE - " + username + ' | ' + date_string
#create a new public playlist to be populated
sp.user_playlist_create(username, name=playlist_name, public=True)
#id of playlist we just created
playlist_id = sp.current_user_playlists(limit=1)['items'][0]['id']
#add playlist tracks to this playlist
sp.user_playlist_add_tracks(username,playlist_id,tracks=track_ids)
return render(request, 'blog/save_playlist.html', 'playlist_id':playlist_id)
当用户输入他们的用户名并登录到 Spotify 时,会不断弹出多个窗口,而不仅仅是一个(参见下面的终端)。我认为问题出在获取令牌的某个地方。
尝试登录时的终端输出
我已将 Spotify 开发者控制台中的重定向 URI 设置为与上述相同 ('http://127.0.0.1:8000/save_playlist/')。
提前致谢!
【问题讨论】:
【参考方案1】:util.prompt_for_user_token
不应在允许任何用户登录的网络应用程序中使用,因为我们事先不知道用户的 ID/姓名。只是本地快速上手的好帮手。
您应该直接使用spotipy.oauth2.SpotifyOAuth
,为您的用户指定一个唯一的缓存路径。对于网络应用程序,它将是一个会话 ID。
这是为 Flask 制作的完整示例,您可以根据自己的需要进行调整 https://github.com/plamere/spotipy/blob/master/examples/app.py
【讨论】:
【参考方案2】:不使用 Spotipy,一个快速的解决方案是转到 https://pypi.org/project/spotify-token/,它是一个 Python 脚本,如果提供了 Spotify 用户名和密码,它可以生成一个 Spotify 令牌。
话虽如此,但请记住,并非每个人都愿意提供他们的用户名和密码。干杯!
【讨论】:
不鼓励这种解决方案,因为它需要担心如何安全地存储密码,并且它不使用 API,这意味着它随时可能中断。以上是关于Spotify 身份验证流程 (Spotify API)的主要内容,如果未能解决你的问题,请参考以下文章
用于 Spotify 的 Python 社交身份验证:重定向缺少“状态”参数
带有 spotify 身份验证回调 url 的 Aspnet Core MVC 应用程序重定向到 127.0.0.1
如何从 spotify [身份验证库] [spotify-android-auth-1.0] 注销