认证不同Spotify账号后,print(user_id)仍输出同一用户的问题
问题原因分析
你的代码始终返回同一用户信息,核心问题出在全局文件缓存和Session配置缺失:
- Spotipy默认全局文件缓存:
SpotifyOAuth默认会把用户token缓存到本地.cache文件,所有请求共享这个文件。即使切换账号认证,新token会被旧缓存覆盖或读取旧token,导致获取到之前用户的信息。 - Session未正确初始化:代码导入了
flask_session但未完成配置初始化,session.clear()无法有效清除用户的认证状态,不同用户的会话互相干扰。 - OAuth实例未关联用户Session:
authenticate和callback中的SpotifyOAuth实例是独立创建的,没有使用用户专属的Session存储token,导致认证信息全局共享。
修复方案
按以下步骤修改代码:
1. 配置并初始化Flask Session
添加Session配置,用Redis存储会话数据(你已经导入了Redis,直接复用即可):
# 在app创建后添加 app.config['SESSION_TYPE'] = 'redis' app.config['SESSION_REDIS'] = r # 复用已创建的redis连接 # 初始化flask_session Session(app)
2. 使用Session存储Token,替代全局文件缓存
引入SpotifySessionCacheHandler,将token存入用户专属的Session中,避免全局缓存干扰:
# 导入SpotifySessionCacheHandler from spotipy.oauth2 import SpotifyOAuth, SpotifySessionCacheHandler # 修改authenticate路由 @app.route('/authenticate', methods=['GET']) def authenticate_user(): cache_handler = SpotifySessionCacheHandler(session) sp_oauth = SpotifyOAuth( client_id=client_id, client_secret=client_secret, redirect_uri=redirect_uri, scope=scopes, show_dialog=True, cache_handler=cache_handler ) auth_url = sp_oauth.get_authorize_url() return jsonify({'url': auth_url}) # 修改callback路由 @app.route('/callback') def callback(): session.clear() cache_handler = SpotifySessionCacheHandler(session) sp_oauth = SpotifyOAuth( client_id=client_id, client_secret=client_secret, redirect_uri=redirect_uri, scope=scopes, cache_handler=cache_handler ) code = request.args.get('code') # 禁用缓存检查,确保使用新获取的token token_info = sp_oauth.get_access_token(code, check_cache=False) sp = spotipy.Spotify(auth=token_info['access_token']) user = sp.current_user() user_id = user['id'] print(user_id) # 将token存入session,供后续接口使用 session['token_info'] = token_info return redirect('http://localhost:3000/')
3. 清理旧缓存文件
删除项目根目录下的.cache文件,避免残留的旧token影响测试。
4. 验证效果
重启Flask服务后,切换不同Spotify账号认证,此时会获取到对应账号的user_id,不会再复用旧用户信息。
内容的提问来源于stack exchange,提问作者Abraham.
相关产品推荐
相关产品推荐

