Flask 应用程序:Spotify API OAuth 无法在 Docker 容器中工作

问题描述 投票:0回答:1

我的烧瓶应用程序遇到问题。当 not 在 docker 容器内运行应用程序时,我能够通过 Spotify API 成功授权。

  1. 用户导航至
    localhost:5000/login
  2. 显示Spotify授权协议
  3. 用户点击“同意”
  4. 用户被路由到
    localhost:5000/callback
    ,其中显示文本“成功”

但是当我对 Flask 应用程序进行 dockerize 时,当用户在授权页面上单击“同意”时,我收到以下错误:

下面是我的 Dockerfile 和 app.py 文件

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"]

应用程序.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")

python docker flask spotify
1个回答
0
投票

在为 Spotify 生成令牌的代码部分(错误的根源),我使用以下方法检索我的客户端 ID 和秘密:

CLIENT_ID = os.getenv("CLIENT_ID")

CLIENT_SECRET = os.getenv("CLIENT_SECRET")

我扔了一个打印语句,看到授权标头看起来像这样 --

Authorization: Basic "":""
,而它应该看起来像这样
Authorization: Basic CLIENT_ID:CLIENT_SECRET
。这证实了 CLIENT_ID 和 CLIENT_SECRET 不可用。

我将以下内容添加到我的 Dockerfile 中,现在我可以成功授权:

ENV CLIENT_ID=*****

ENV CLIENT_SECRET=*****

更进一步,我很可能会删除上述两个声明,并将

os.getenv
声明添加到我的 Flask 应用程序配置文件中。

 

© www.soinside.com 2019 - 2024. All rights reserved.