FastAPI中如何在RedirectResponse后获取URL中的查询参数?
如何在FastAPI的OAuth授权码流程中获取回调URL的code参数
你之前的思路存在核心误区:code参数根本不会出现在/install/的请求里——它是第三方授权服务在用户完成授权操作后,重定向到你指定的redirect_uri(也就是http://127.0.0.1:8000/callback/)时才附带的查询参数。
正确实现步骤
- 为
redirect_uri对应的路径创建专属路由(即/callback/),在这个路由里直接接收code参数,FastAPI会自动帮你解析URL中的查询参数。 - 必须验证
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
相关产品推荐
相关产品推荐

