FastAPI如何实现用户未登录时当前用户返回None而非401
解决方法
核心原因是默认的OAuth2PasswordBearer在检测不到请求携带合规token时会主动抛出401错误,不会进入后续的依赖逻辑,我们可以通过修改参数和依赖逻辑实现需求,调整步骤如下:
- 给
OAuth2PasswordBearer添加auto_error=False参数,无token时直接返回None而非抛出异常 - 修改
get_current_user依赖逻辑,判断token为空时直接返回None,否则正常解析返回用户对象 - 调整类型标注适配
None返回值
调整后的完整代码如下:
from typing import Optional from fastapi import Depends, FastAPI from fastapi.security import OAuth2PasswordBearer from pydantic import BaseModel app = FastAPI() # 新增auto_error=False参数,无token时返回None不抛401 oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token", auto_error=False) class User(BaseModel): username: str email: Optional[str] = None full_name: Optional[str] = None disabled: Optional[bool] = None def fake_decode_token(token): return User( username=token + "fakedecoded", email="john@example.com", full_name="John Doe" ) async def get_current_user(token: Optional[str] = Depends(oauth2_scheme)) -> Optional[User]: # 先判断token是否存在,不存在直接返回None if not token: return None user = fake_decode_token(token) return user @app.get("/api_limits") async def read_users_me(current_user: Optional[User] = Depends(get_current_user)): if current_user is None: return 2 return 5
调整后未登录请求访问/api_limits时不会直接返回401,会正常进入接口逻辑,current_user值为None,最终返回2;携带有效token访问时current_user为解析后的用户对象,返回5。
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

