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

如何在FastAPI项目中使用Authlib实现Token的保存与复用

解决方案

你已经配置了SessionMiddleware,直接用用户会话存储token即可,不需要额外引入数据库或缓存,修改代码如下:

1. 补充必要导入

在代码开头新增RedirectResponse导入:

from starlette.responses import RedirectResponse

2. 调整授权回调接口存储token

在/auth接口拿到token后,存入当前用户的会话中:

@app.get("/auth")
async def auth(request: Request):
    token = await oauth.some_service.authorize_access_token(request)
    # 存储token到加密会话
    request.session['oauth_token'] = token
    return token

3. 调整业务接口读取token

在调用第三方接口前,先从会话中取出token传入Authlib的请求方法:

@app.get("/account")
async def get_account(request: Request):
    token = request.session.get('oauth_token')
    # 无有效token时跳转到登录页
    if not token:
        return RedirectResponse(url='/login')
    account_url = "https://some-service.com/account"
    resp = await oauth.some_service.get(account_url, token=token)
    # 若Authlib自动刷新了token,更新会话中的存储
    if resp.token != token:
        request.session['oauth_token'] = resp.token
    return resp.json()

补充说明

  • Authlib本身不负责token的持久化,因为不同业务场景的存储方案差异很大,你需要根据自己的场景选择存储介质:
    • 面向浏览器用户的OAuth流程,用SessionMiddleware存储完全够用,会话内容会加密后存在用户Cookie中,不会泄露敏感信息
    • 服务端无用户交互的客户端凭证模式,才需要将token存入Redis、数据库这类公共存储
  • 只要你获取的token包含refresh_token和expires_at字段,Authlib会自动处理token过期刷新逻辑,你只需要把返回的新token更新回存储即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:27:02