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

Flask Session与Spotify OAuth用户信息存储异常问题求助

排查Spotify OAuth用户信息串用的问题

根据你的描述,核心问题是所有用户共享了同一个Spotify token,导致请求API时始终用的是你的账号权限。结合Flask+Spotipy的常见坑,按以下步骤排查:

1. 检查Token存储方式,禁止用全局变量

如果你的代码里把token_info存在了全局变量(比如模块级变量、global声明的变量),所有用户都会共用这个token,必然串号。必须把token存在Flask的session中,每个用户的session是隔离的:

  • 回调路由获取token后,要存到session['spotify_token'] = token_info
  • 调用API前,从session.get('spotify_token')取出当前用户的token

2. 每次请求都要初始化独立的Spotipy实例

不要复用全局的Spotipy客户端对象,每次处理请求时,用当前用户session里的token重新初始化:

@app.route('/getPlaylists')
def get_playlists():
    token_info = session.get('spotify_token')
    if not token_info:
        return redirect('/spotify-login')
    
    # 初始化当前用户的Spotipy客户端
    sp = spotipy.Spotify(auth=token_info['access_token'])
    # 后续调用API都是当前用户的权限
    user = sp.current_user()
    playlists = sp.current_user_playlists()

3. 回调路由必须验证State参数

Spotify OAuth的state参数用于关联用户会话,防止CSRF,同时确保回调拿到的token属于当前请求的用户:

@app.route('/spotify-login')
def spotify_login():
    sp_oauth = spotipy.oauth2.SpotifyOAuth(
        client_id=YOUR_CLIENT_ID,
        client_secret=YOUR_CLIENT_SECRET,
        redirect_uri=YOUR_REDIRECT_URI,
        scope="user-read-private playlist-read-private"
    )
    # 生成state并存入session
    state = sp_oauth.state
    session['spotify_state'] = state
    auth_url = sp_oauth.get_authorize_url()
    return redirect(auth_url)

@app.route('/spotify-callback')
def spotify_callback():
    sp_oauth = spotipy.oauth2.SpotifyOAuth(...)
    # 验证state是否匹配当前session
    if request.args.get('state') != session.get('spotify_state'):
        abort(403)  # 不匹配直接拒绝
    
    token_info = sp_oauth.get_access_token(request.args['code'])
    session['spotify_token'] = token_info  # 存到当前用户session
    return redirect('/getPlaylists')

4. 检查Flask Session配置

确保你在Flask应用中正确设置了SECRET_KEY,否则session无法正常加密存储,可能导致token丢失或串用:

app = Flask(__name__)
app.secret_key = "your-strong-random-secret-key-here"  # 必须设置

5. 处理Token过期的情况

Spotify的access_token会过期,需要用refresh_token刷新,并更新session中的token:

@app.route('/getPlaylists')
def get_playlists():
    token_info = session.get('spotify_token')
    if not token_info:
        return redirect('/spotify-login')
    
    sp_oauth = spotipy.oauth2.SpotifyOAuth(...)
    # 检查token是否过期,过期则刷新
    if sp_oauth.is_token_expired(token_info):
        token_info = sp_oauth.refresh_access_token(token_info['refresh_token'])
        session['spotify_token'] = token_info  # 更新session中的token
    
    sp = spotipy.Spotify(auth=token_info['access_token'])
    # 后续API调用

额外验证步骤

  • 测试时打开无痕窗口,用不同测试用户登录,查看session['spotify_token']的access_token是否不同
  • 回调路由中打印token_info['scope']和token_info['expires_at'],确认每个用户的token都是独立的

内容的提问来源于stack exchange,提问作者Felipe Firmida

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 14:52:25