【问题标题】:FastAPI with redirects on AWS Lambda : Too many redirectsFastAPI 与 AWS Lambda 上的重定向:重定向太多
【发布时间】:2022-11-16 06:23:49
【问题描述】:

我有一个 Spotify 项目需要通过他们的 API 获得授权码。我构建了一个 API 来将用户重定向到 Spotify 的登录,然后返回到我的 API 以及用户代码。

应用程序接口:

import boto3
import requests
import base64
from fastapi import APIRouter
from fastapi.responses import RedirectResponse
from mangum import Mangum
from client import client_id, client_secret

app = APIRouter()
lambda_handler = Mangum(app,lifespan='off')

url = 'https://XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.lambda-url.me-south-1.on.aws'

@app.get("/")
async def root():
    return RedirectResponse("/login/")

@app.get("/home/")
async def main(code: str):
    encoded = base64.b64encode(
        (client_id + ":" + client_secret).encode("ascii")
    ).decode("ascii")

    base = "https://accounts.spotify.com/api/token"
    payload = {
        "grant_type": "authorization_code",
        "code": code,
        "redirect_uri": f"{url}/home/",
    }

    headers = {
        "Content-Type": "application/x-www-form-urlencoded",
        "Authorization": "Basic " + encoded,
    }

    tokens = requests.post(base, data=payload, headers=headers).json()
    refresh_token = tokens["refresh_token"]
    access_token = tokens["access_token"]

    email_base_url = "https://api.spotify.com/v1/me"
    email_headers = {
        "Accept": "application/json",
        "Content-Type": "application/json",
        "Authorization": f"Bearer {access_token}",
    }

    email = requests.get(email_base_url, headers=email_headers).json()["email"]

    dynamo = boto3.resource("dynamodb")
    tokens = dynamo.Table("tokens")
    item = {"email": email, "token": access_token, "refresh_token": refresh_token}
    tokens.put_item(Item=item)

    return {"message": "success"}

@app.get("/login/")
async def login():
    base = "https://accounts.spotify.com/authorize?"
    base += "response_type=code"
    base += f"&client_id={client_id}"
    base += "&scope=user-read-recently-played user-read-email"
    base += f"&redirect_uri={url}/home/"
    return RedirectResponse(base)

当我在本地主机上运行它或使用 ngrok 隧道时,API 会按预期工作。但是,当我将它上传到 AWS Lambda 并生成一个函数 URL 时,浏览器会为三个端点中的任何一个返回错误 ERR_TOO_MANY_REDIRECTS

我看过有关此主题的问题,但它们都包含 CloudFront。我很乐意根据需要提供有关 Lambda 函数的信息。

【问题讨论】:

    标签: python amazon-web-services aws-lambda fastapi


    【解决方案1】:

    如果你打电话给 baseurl/baseurl/login 会有什么不同吗?

    如果有人已经登录并点击了你重定向他的 baseurl。

    / -> /login -> spotify -> /home

    您可以尝试将 / -> /login 排序为一个,因为它仍然只是一个重定向。

    更新 1:

    不要在loginmain 中使用相同的变量base

    1. 记录您重定向的 URL。这将帮助您了解正在发生的事情。
    2. 在将 url 作为 url 参数传递之前对其进行 Urlencode。 base += f"&redirect_uri= {urlencode(url)}/home/"

    【讨论】:

    • / 成功重定向到 /login/,但在那之后 /login/ 一直重定向到自身,直到浏览器停止它。直接访问/login/ 会导致相同的递归循环。目前看来唯一可接受的端点是根。我尝试更改 /login/ 以返回 json 而不是重定向,它仍然递归到自身。但是,更改 root 以返回 json 成功显示 json。
    猜你喜欢
    • 2019-09-07
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 2015-06-13
    • 2019-09-11
    相关资源
    最近更新 更多