如何在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、数据库这类公共存储
- 面向浏览器用户的OAuth流程,用
- 只要你获取的token包含
refresh_token和expires_at字段,Authlib会自动处理token过期刷新逻辑,你只需要把返回的新token更新回存储即可。
内容的提问来源于stack exchange,提问作者catscoolzhyk
相关产品推荐
相关产品推荐

