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 API 身份验证流程演示

用于 Spotify 的 Python 社交身份验证:重定向缺少“状态”参数

带有 spotify 身份验证回调 url 的 Aspnet Core MVC 应用程序重定向到 127.0.0.1

如何从 spotify [身份验证库] [spotify-android-auth-1.0] 注销

在使用 spotify api 进行用户身份验证后管理 spotify 订阅(取消、升级)

如何在我当前使用 Spotify Search API 的代码上应用 Spotify API 身份验证?