【发布时间】: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