FastAPI 中如何使用 HTTP Bearer 认证?

推荐答案

在 FastAPI 中使用 HTTP Bearer 认证可以通过 OAuth2PasswordBearer 来实现。以下是一个简单的示例:

-- -------------------- ---- -------
---- ------- ------ -------- -------- -------------- ------
---- ---------------- ------ --------------------
---- -------- ------ ---------

--- - ---------

------------- - --------------------------------------

----- ----------------
    --------- ---

--- -------------------------
    ------ --------------------

----- --- ----------------------- --- - ------------------------
    ---- - ------------------------
    -- --- -----
        ----- --------------
            -----------------------------------------
            --------------- -------------- -------------
            ---------------------------- ----------
        -
    ------ ----

-------------------
----- --- ------------------------ ---- - ---------------------------
    ------ ------------ ----------------------

在这个示例中,OAuth2PasswordBearer 用于定义 Bearer 认证的流程。tokenUrl 参数指定了获取 token 的 URL。get_current_user 函数用于验证 token 并返回当前用户。

本题详细解读

1. OAuth2PasswordBearer

OAuth2PasswordBearer 是 FastAPI 提供的一个安全工具,用于处理 OAuth2 的 Bearer 认证。它会在请求头中查找 Authorization 字段,并提取 Bearer token。

  • tokenUrl:指定获取 token 的 URL。这个 URL 通常是一个登录接口,用户通过该接口获取 token。

2. 获取当前用户

get_current_user 函数依赖于 oauth2_scheme,它会从请求头中提取 token,并通过 fake_decode_token 函数解码 token 以获取用户信息。

-- -------------------- ---- -------
----- --- ----------------------- --- - ------------------------
    ---- - ------------------------
    -- --- -----
        ----- --------------
            -----------------------------------------
            --------------- -------------- -------------
            ---------------------------- ----------
        -
    ------ ----
  • Depends(oauth2_scheme):表示 get_current_user 函数依赖于 oauth2_scheme 来获取 token。
  • fake_decode_token:这是一个模拟函数,实际应用中应该替换为真实的 token 解码逻辑。

3. 使用认证

在路由中使用 Depends(get_current_user) 来确保只有认证通过的用户才能访问该路由。

  • current_user: User = Depends(get_current_user):表示该路由依赖于 get_current_user 函数来获取当前用户信息。

4. 错误处理

如果 token 无效或未提供,get_current_user 函数会抛出 HTTPException,返回 401 状态码和错误信息。

  • status_code=status.HTTP_401_UNAUTHORIZED:表示未授权状态码。
  • headers={"WWW-Authenticate": "Bearer"}:在响应头中添加 WWW-Authenticate 字段,提示客户端使用 Bearer 认证。
纠错
反馈