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

Flask应用Docker容器中Spotify API OAuth授权失败问题

Flask应用Docker化后Spotify授权失败问题

问题现象

本地直接运行Flask应用时,Spotify授权流程完全正常:

  • 用户访问localhost:5000/login
  • 页面显示Spotify授权协议
  • 用户点击“同意”后,被重定向到localhost:5000/callback,页面显示“Success”

但把应用Docker容器化后,用户在授权页面点击“同意”时会出现错误。

相关代码

Dockerfile

FROM python:3.9-slim-buster
WORKDIR /app
COPY ./requirements.txt /app
RUN pip install -r requirements.txt
COPY . .
EXPOSE 5000
ENV FLASK_APP=app.py
CMD ["flask", "run", "--host", "0.0.0.0"]

app.py

from flask import Flask, render_template, flash, session, redirect, request, Response, session, make_response
from spotify_connector import SpotifyConnector
connector = SpotifyConnector()

@app.route('/')
def index():
    return "INDEX"

@app.route('/login')
def login():
    client_id = app.config['CLIENT_ID']
    redirect_uri = app.config['REDIRECT_URI']
    scope = app.config['SCOPE']
    authorize_url = 'https://accounts.spotify.com/en/authorize?'
    state_key = connector.create_state_key(15)
    session['state_key'] = state_key
    parameters = 'response_type=code&client_id=' + client_id + '&redirect_uri=' + redirect_uri + '&scope=' + scope + '&state=' + state_key
    response = make_response(redirect(authorize_url + parameters))
    return response


@app.route('/callback')
def callback():
    code = request.args.get('code', None)
    state = request.args.get('state', None)
    session.pop('state_key', None)
    payload = connector.getToken(code)
    if payload is not None:
        session['access_token'] = payload['access_token']
        session['refresh_token'] = payload['refresh_token']
        return "SUCCESS"
    else:
        return "FAILURE"

if __name__ == "__main__":
    app.run(host="localhost")

问题排查与解决方法

1. 重定向URI不匹配(最常见原因)

Spotify开发者后台配置的REDIRECT_URI如果还是localhost:5000/callback,Docker运行时用户实际访问的是宿主机的IP/域名,但授权回调会被指向容器内部的localhost,导致Spotify找不到回调地址直接报错。

解决步骤:

  • 登录Spotify开发者后台,把重定向URI改成宿主机的访问地址,比如http://你的宿主机IP:5000/callback或者http://你的域名:5000/callback
  • 同步修改Flask应用的REDIRECT_URI配置,确保和后台一致,建议用环境变量传递这个值,避免硬编码

2. Flask会话验证失败

本地运行时Flask用内存存储会话,Docker容器内的会话和本地完全独立,授权时的state校验(如果SpotifyConnector的getToken方法里做了state验证)会失败。

解决步骤:

  • 给Flask应用添加固定的SECRET_KEY,保证会话加密逻辑一致,在app.py开头补充:
    app = Flask(__name__)
    app.secret_key = "生成一个随机的密钥字符串(比如用os.urandom(24).hex()生成)"
    
  • 把敏感配置(CLIENT_ID、REDIRECT_URI、SCOPE)通过环境变量传递,Docker运行时用-e参数传入:
    docker run -p 5000:5000 \
      -e SPOTIFY_CLIENT_ID=你的Spotify客户端ID \
      -e SPOTIFY_REDIRECT_URI=http://宿主机IP:5000/callback \
      -e SPOTIFY_SCOPE=你的权限范围 \
      你的镜像名称
    

3. 端口映射错误

如果运行容器时没做端口映射,用户根本访问不到容器内的5000端口,授权流程自然走不下去。确保运行命令包含-p 5000:5000,把容器的5000端口映射到宿主机的5000端口。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 15:58:14