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

FastAPI中如何在RedirectResponse后获取URL中的查询参数?

如何在FastAPI的OAuth授权码流程中获取回调URL的code参数

你之前的思路存在核心误区:code参数根本不会出现在/install/的请求里——它是第三方授权服务在用户完成授权操作后,重定向到你指定的redirect_uri(也就是http://127.0.0.1:8000/callback/)时才附带的查询参数。

正确实现步骤

  1. 为redirect_uri对应的路径创建专属路由(即/callback/),在这个路由里直接接收code参数,FastAPI会自动帮你解析URL中的查询参数。
  2. 必须验证state参数(你之前生成的随机字符串),这是OAuth流程中防止CSRF攻击的必要步骤,需要把生成的state存入用户会话,回调时做一致性校验。

完整代码示例

主应用配置(添加会话中间件)

from fastapi import FastAPI
from fastapi.middleware.sessions import SessionMiddleware

app = FastAPI()

# 配置会话中间件,密钥请替换为自己的安全密钥
app.add_middleware(SessionMiddleware, secret_key="your-own-secret-key")

# 导入路由模块
from routers import oauth_router
app.include_router(oauth_router)

OAuth路由实现

from uuid import uuid4
from oauthlib.oauth2 import WebApplicationClient
from fastapi import APIRouter, Request, Query, RedirectResponse

router = APIRouter()

@router.get("/install/")
async def install(request: Request):
    """触发OAuth授权流程"""
    client_id = "xxx"
    client = WebApplicationClient(client_id)
    state = str(uuid4())
    
    # 将state存入用户会话,用于后续回调验证
    request.session["oauth_state"] = state
    
    authorization_url = "https://api-url.com/auth/authorize"
    auth_redirect_url = client.prepare_request_uri(
        authorization_url,
        redirect_uri="http://127.0.0.1:8000/callback/",
        scope=["read:user"],
        state=state,
    )
    
    return RedirectResponse(url=auth_redirect_url)

@router.get("/callback/")
async def callback(
    request: Request,
    code: str = Query(...),  # FastAPI自动解析URL中的code参数
    state: str = Query(...)
):
    """处理授权回调,获取code参数"""
    # 验证state,防止CSRF攻击
    stored_state = request.session.get("oauth_state")
    if stored_state != state:
        return {"error": "无效的state参数,可能存在CSRF风险"}
    
    # 这里成功拿到授权码code,后续可用于换取access_token
    print("获取到的授权码:", code)
    
    # 后续逻辑示例:用code调用第三方接口换取access_token
    # token_url = "https://api-url.com/auth/token"
    # token_response = client.prepare_request_body(
    #     client_id=client_id,
    #     code=code,
    #     redirect_uri="http://127.0.0.1:8000/callback/",
    #     # 如果有client_secret也需要传入
    # )
    
    return {"code": code, "message": "授权成功"}

关键说明

  • 不需要使用selenium:这是标准的服务端OAuth流程,完全不需要模拟浏览器操作,第三方授权服务会主动把code带到你的回调路由。
  • 为什么之前的尝试失败:/install/路由只是发起重定向的起点,此时还未触发用户授权,自然不会有code参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:26:04