You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

认证不同Spotify账号后,print(user_id)仍输出同一用户的问题

问题原因分析

你的代码始终返回同一用户信息,核心问题出在全局文件缓存和Session配置缺失:

  1. Spotipy默认全局文件缓存:SpotifyOAuth默认会把用户token缓存到本地.cache文件,所有请求共享这个文件。即使切换账号认证,新token会被旧缓存覆盖或读取旧token,导致获取到之前用户的信息。
  2. Session未正确初始化:代码导入了flask_session但未完成配置初始化,session.clear()无法有效清除用户的认证状态,不同用户的会话互相干扰。
  3. 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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 06:10:54