【发布时间】:2022-05-11 23:35:06
【问题描述】:
我正在尝试使用 Spotipy 访问用户的 Spotify 库,但遇到了一些麻烦。作为背景,我使用的是 Flask、SQLAlchemy 和 Flask-Login。
我在 github 上查看了 this tutorial 以开始使用,但这对我来说不太适用,因为如果您使用缓存,所有用户都可以访问其令牌被缓存的用户的播放列表,因为那里是缓存令牌,第一个用户之后的任何用户都无法登录 Spotify。这是一些初始设置:
sp_oauth = oauth2.SpotifyOAuth(os.environ['SPOTIPY_CLIENT_ID'],
os.environ['SPOTIPY_CLIENT_SECRET'],
os.environ['SPOTIPY_REDIRECT_URI'],
scope="user-library-read")
为了解决这个问题,我首先尝试将每个用户的访问代码存储在我的数据库中(我也在使用 SQLAlchemy)。它看起来像这样(在 Spotipy 使用访问代码重定向到的页面的方法下):
if request.args.get("code"):
dbsession.query(User).get(current_user.uid).addService(
request.args["code"])
dbsession.commit()
但是,此路由旨在返回用户拥有的播放列表的名称,因此我希望只要用户登录,每次都无需通过 Spotify 授权 URL 即可访问它。所以,在request.args["code"] 为空的情况,我试试:
token_info = sp_oauth.get_access_token(dbsession.query(User)
.get(current_user.uid)
.getService())
spotify = spotipy.Spotify(token_info["access_token"])
然后我尝试使用这个 Spotify 实例访问用户。但是,使用存储的访问代码(不出所料)会给我一个 Bad Request 错误。我不确定如何获取新代码,或者我应该存储什么以便我不需要缓存但仍然可以获得访问播放列表的凭据。或者,有没有一种方法可以缓存但只有某些用户可以访问缓存中的某些令牌?
谢谢!
【问题讨论】:
-
您需要存储和使用刷新令牌以实现长期 OAuth2 访问,详见 Spotify API 授权文档的Authorization Code Flow 部分
标签: python caching flask spotify spotipy