Starlette/FastAPI实现SSO时如何在视图中完成用户登录
Starlette/FastAPI SSO回调视图内实现登录的解决方案
Starlette的认证中间件没有强制要求只能在中间件层完成登录逻辑,官方文档提到的「通常在中间件完成认证」针对的是普通请求的身份校验场景,SSO回调属于主动登录场景,完全可以在视图内完成登录态写入,实现和Djangologin方法对等的效果。
核心实现思路
Starlette的登录态本质是基于SessionMiddleware存储的用户身份标识,你只需要在回调视图中完成Facebook授权校验、确认用户身份合法后,直接操作session写入用户标识即可,无需依赖中间件处理登录逻辑。
具体实现步骤
- 第一步:提前配置
SessionMiddleware,这是存储登录态的基础
示例代码:from fastapi import FastAPI from starlette.middleware.sessions import SessionMiddleware app = FastAPI() # 生产环境替换为足够随机的自定义密钥 app.add_middleware(SessionMiddleware, secret_key="your-custom-secret-key") - 第二步:在Facebook授权回调视图中完成校验后直接写入登录态
示例代码:from fastapi import Request from starlette.responses import RedirectResponse @app.get("/auth/facebook/callback") async def facebook_callback(request: Request, code: str): # 1. 用返回的code向Facebook接口换取access_token # 2. 用access_token拉取用户公开信息,校验用户合法性 # 3. 匹配到系统内的用户对象后,写入session完成登录 request.session["user_id"] = user.id # user为系统内的有效用户对象 # 4. 跳转到登录后首页 return RedirectResponse(url="/dashboard") - 第三步:原有认证逻辑不需要改动,中间件按常规方式校验登录态即可
如果使用了Starlette官方的AuthenticationMiddleware,对应的认证后端只需要正常读取session中的用户标识做校验即可:from starlette.authentication import AuthenticationBackend, AuthCredentials, SimpleUser class CustomAuthBackend(AuthenticationBackend): async def authenticate(self, request): user_id = request.session.get("user_id") if not user_id: return None # 可补充从数据库读取完整用户信息的逻辑 return AuthCredentials(["authenticated"]), SimpleUser(user_id)
注意事项
- session中仅存储用户ID这类标识即可,不要写入密码等敏感数据
- 生产环境的
SessionMiddleware密钥必须使用随机高强度字符串,避免被破解 - 登出逻辑也可以直接在视图内实现,调用
request.session.pop("user_id", None)即可清除登录态
内容的提问来源于stack exchange,提问作者tikej
相关产品推荐
相关产品推荐

