前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >FastAPI 中的 OAuth2PasswordBearer 授权

FastAPI 中的 OAuth2PasswordBearer 授权

作者头像
井九
发布2024-10-18 09:54:14
1300
发布2024-10-18 09:54:14
举报
文章被收录于专栏:四楼没电梯

在构建现代 Web 应用程序时,身份验证和授权 是两个不可避免的核心问题。FastAPI 提供了一种简洁而强大的方式来处理身份验证,特别是通过 OAuth2 这种标准协议。在这篇文章中,我们将详细介绍 FastAPI 中的 OAuth2PasswordBearer 授权机制,并结合代码实例来理解其工作原理。

什么是 OAuth2PasswordBearer?

OAuth2PasswordBearerOAuth2 标准中的一种授权模式。它假设客户端通过发送一个 Bearer token (通常是通过密码登录获取的)来请求资源。这个 token 可以用于访问受保护的 API。

核心工作流程
  1. 客户端请求 token,提供 用户名密码
  2. 服务器验证凭据,如果有效,则返回 access token
  3. 客户端使用该 token 来请求受保护的资源。
  4. 服务器通过验证 token 来决定是否授权访问。

在 FastAPI 中,OAuth2PasswordBearer 是一种依赖注入,它会自动从请求中提取 Bearer token

实现 OAuth2PasswordBearer 授权

1. 安装依赖

首先,确保你已经安装了 FastAPIuvicorn

代码语言:javascript
复制
pip install fastapi uvicorn
2. 定义 OAuth2PasswordBearer

接下来,我们将定义一个 OAuth2PasswordBearer 实例,它会从请求的 Authorization 头中提取 Bearer token:

代码语言:javascript
复制
from fastapi import FastAPI, Depends
from fastapi.security import OAuth2PasswordBearer
from fastapi.exceptions import HTTPException
from starlette.status import HTTP_401_UNAUTHORIZED

app = FastAPI()

# 定义 OAuth2PasswordBearer 实例
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

# 一个简单的路径,要求有 Bearer token
@app.get("/users/me")
async def read_users_me(token: str = Depends(oauth2_scheme)):
    return {"token": token}

解释

  • tokenUrl="token"OAuth2PasswordBearer 需要指定一个 URL 用于获取 token。客户端会向该 URL 提交用户名和密码来请求 token。
  • Depends(oauth2_scheme):FastAPI 的依赖注入系统,会自动从请求中提取并验证 token。
3. 模拟登录获取 Token

要完成 OAuth2 的授权流程,我们需要定义一个 token endpoint,客户端可以通过它来请求 token。

代码语言:javascript
复制
from pydantic import BaseModel
from fastapi import Form

class Token(BaseModel):
    access_token: str
    token_type: str

@app.post("/token", response_model=Token)
async def login(username: str = Form(), password: str = Form()):
    if username == "test" and password == "secret":
        return {"access_token": "fake-token", "token_type": "bearer"}
    raise HTTPException(
        status_code=HTTP_401_UNAUTHORIZED,
        detail="Invalid credentials",
        headers={"WWW-Authenticate": "Bearer"},
    )

解释

  • Form():用于从表单中提取用户名和密码。
  • response_model=Token:返回的 JSON 结构与 Token 模型匹配。
  • “fake-token”:为了简化演示,这里直接返回一个伪造的 token。
4. 保护 API 路由

一旦我们定义了获取 token 的逻辑,我们就可以用这个 token 访问受保护的 API 路由。

代码语言:javascript
复制
@app.get("/protected-route")
async def protected_route(token: str = Depends(oauth2_scheme)):
    if token != "fake-token":
        raise HTTPException(
            status_code=HTTP_401_UNAUTHORIZED,
            detail="Invalid token",
            headers={"WWW-Authenticate": "Bearer"},
        )
    return {"message": "Welcome to the protected route!"}

解释

  • Depends(oauth2_scheme):从请求中提取 token。
  • 如果 token 无效,则抛出 401 Unauthorized 错误。
5. 运行应用

现在,你可以通过以下命令运行应用:

代码语言:javascript
复制
uvicorn main:app --reload

在终端中访问 http://127.0.0.1:8000/docs,你会看到 FastAPI 的交互式文档。在这里,你可以尝试调用 /token 路由获取 token,然后将 token 应用于 /protected-route,以验证授权机制的工作。

完整示例

代码语言:javascript
复制
from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
from pydantic import BaseModel
from fastapi import Form
from starlette.status import HTTP_401_UNAUTHORIZED

app = FastAPI()

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

class Token(BaseModel):
    access_token: str
    token_type: str

@app.post("/token", response_model=Token)
async def login(username: str = Form(), password: str = Form()):
    if username == "test" and password == "secret":
        return {"access_token": "fake-token", "token_type": "bearer"}
    raise HTTPException(
        status_code=HTTP_401_UNAUTHORIZED,
        detail="Invalid credentials",
        headers={"WWW-Authenticate": "Bearer"},
    )

@app.get("/users/me")
async def read_users_me(token: str = Depends(oauth2_scheme)):
    return {"token": token}

@app.get("/protected-route")
async def protected_route(token: str = Depends(oauth2_scheme)):
    if token != "fake-token":
        raise HTTPException(
            status_code=HTTP_401_UNAUTHORIZED,
            detail="Invalid token",
            headers={"WWW-Authenticate": "Bearer"},
        )
    return {"message": "Welcome to the protected route!"}

总结

在本文中,我们学习了如何使用 FastAPI 中的 OAuth2PasswordBearer 来实现身份验证和授权。通过使用 FastAPI 提供的依赖注入系统,我们可以轻松地将授权逻辑集成到 API 路由中,并确保只有合法的请求才会被授权访问受保护的资源。OAuth2 是处理身份验证的强大工具,而 FastAPI 则为我们提供了简洁的实现方式。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是 OAuth2PasswordBearer?
    • 核心工作流程
    • 实现 OAuth2PasswordBearer 授权
      • 1. 安装依赖
        • 2. 定义 OAuth2PasswordBearer
          • 3. 模拟登录获取 Token
            • 4. 保护 API 路由
              • 5. 运行应用
              • 完整示例
              • 总结
              相关产品与服务
              多因子身份认证
              多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档