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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:12:03