首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用oauth2和jwt在FastApi中进行身份验证

使用OAuth2和JWT在FastAPI中进行身份验证是一种常见的安全机制。下面是对这个问题的完善且全面的答案:

身份验证是在Web应用程序中验证用户身份的过程。OAuth2和JWT是两个在身份验证中常用的技术。

OAuth2是一种授权框架,用于授权第三方应用程序访问用户资源,而无需共享用户的凭据。它通过令牌的方式实现授权,包括访问令牌和刷新令牌。访问令牌用于访问受保护的资源,而刷新令牌用于获取新的访问令牌。OAuth2有四种授权类型:授权码模式、密码模式、客户端模式和隐式模式。不同类型的授权适用于不同的应用场景。

JWT(JSON Web Token)是一种用于安全传输信息的开放标准。它是一种紧凑且自包含的方式,用于在各方之间传输信息。JWT由三部分组成:头部、载荷和签名。头部包含关于令牌类型和加密算法的信息,载荷包含实际传输的数据,签名用于验证令牌的完整性。JWT可以用于身份验证和信息交换,因为它可以被验证和信任。

在FastAPI中使用OAuth2和JWT进行身份验证可以按照以下步骤进行:

  1. 导入相关模块和库:
代码语言:txt
复制
from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from jose import JWTError, jwt
from passlib.context import CryptContext
from pydantic import BaseModel
from datetime import datetime, timedelta
  1. 定义配置项:
代码语言:txt
复制
SECRET_KEY = "your-secret-key"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30
  1. 创建密码哈希上下文:
代码语言:txt
复制
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
  1. 定义用户模型:
代码语言:txt
复制
class User(BaseModel):
    username: str
    password: str
  1. 模拟用户数据库:
代码语言:txt
复制
fake_users_db = {
    "johnsnow": {
        "username": "johnsnow",
        "full_name": "John Snow",
        "email": "johnsnow@example.com",
        "hashed_password": "$2b$12$AInI7ve5W4wBpZ9C22PvhOv7QyqzxgXt.0EBlF9b95QKqq3Qw8nuq",
    }
}
  1. 创建密码哈希函数:
代码语言:txt
复制
def verify_password(plain_password, hashed_password):
    return pwd_context.verify(plain_password, hashed_password)

def get_password_hash(password):
    return pwd_context.hash(password)
  1. 创建身份验证函数:
代码语言:txt
复制
def authenticate_user(username: str, password: str):
    if username in fake_users_db:
        user = fake_users_db[username]
        if not verify_password(password, user["hashed_password"]):
            return False
        return user

def create_access_token(data: dict, expires_delta: timedelta):
    to_encode = data.copy()
    expire = datetime.utcnow() + expires_delta
    to_encode.update({"exp": expire})
    encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
    return encoded_jwt
  1. 定义登录路由:
代码语言:txt
复制
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="login")

@app.post("/login")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
    user = authenticate_user(form_data.username, form_data.password)
    if not user:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Invalid username or password",
            headers={"WWW-Authenticate": "Bearer"},
        )

    access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
    access_token = create_access_token(
        data={"sub": user["username"]}, expires_delta=access_token_expires
    )
    
    return {"access_token": access_token, "token_type": "bearer"}
  1. 定义受保护的路由:
代码语言:txt
复制
async def get_current_user(token: str = Depends(oauth2_scheme)):
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
        username: str = payload.get("sub")
        if username is None:
            raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid authentication token")
    except JWTError:
        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid authentication token")

    user = fake_users_db.get(username)
    if user is None:
        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="User not found")
    
    return user

@app.get("/protected")
async def protected_route(user: User = Depends(get_current_user)):
    return {"message": f"Hello, {user['full_name']}!"}

这是在FastAPI中使用OAuth2和JWT进行身份验证的一个基本示例。根据具体需求,你可以进一步定制和优化身份验证过程,如添加访问控制列表(ACL)等。

此外,腾讯云提供了一系列与身份验证和授权相关的产品和服务,例如云访问管理(CAM)和访问管理系统(Cloud Access Management)。你可以根据具体需求选择相应的腾讯云产品并参考其官方文档了解更多详情。

参考链接:

  1. OAuth2
  2. JWT
  3. FastAPI
  4. 腾讯云访问管理(CAM)
  5. 腾讯云访问管理系统(Cloud Access Management)
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

共50个视频
动力节点-【CRM客户管理系统】SSM框架项目实战教程-1
动力节点Java培训
这套教程是动力节点最新录制的CRM项目,课程主要针对核心的客户关系管理业务功能进行实现,让你能够深层掌握主流SSM框架、Linux操作系统下部署项目、数据库设计原则和技巧、数据如何通过图表在页面展示、Java对excel文件的处理,学会使用项目管理工具Maven、版本控制工具Git,以及缓存在项目中的运用熟悉前端开发技术及常见的特效等。 通过课程可以了解项目开发流程及项目开发各阶段主要文档及产出物
共50个视频
动力节点-【CRM客户管理系统】SSM框架项目实战教程-2
动力节点Java培训
这套教程是动力节点最新录制的CRM项目,课程主要针对核心的客户关系管理业务功能进行实现,让你能够深层掌握主流SSM框架、Linux操作系统下部署项目、数据库设计原则和技巧、数据如何通过图表在页面展示、Java对excel文件的处理,学会使用项目管理工具Maven、版本控制工具Git,以及缓存在项目中的运用熟悉前端开发技术及常见的特效等。 通过课程可以了解项目开发流程及项目开发各阶段主要文档及产出物
共50个视频
动力节点-【CRM客户管理系统】SSM框架项目实战教程-3
动力节点Java培训
这套教程是动力节点最新录制的CRM项目,课程主要针对核心的客户关系管理业务功能进行实现,让你能够深层掌握主流SSM框架、Linux操作系统下部署项目、数据库设计原则和技巧、数据如何通过图表在页面展示、Java对excel文件的处理,学会使用项目管理工具Maven、版本控制工具Git,以及缓存在项目中的运用熟悉前端开发技术及常见的特效等。 通过课程可以了解项目开发流程及项目开发各阶段主要文档及产出物
共18个视频
动力节点-【CRM客户管理系统】SSM框架项目实战教程-4
动力节点Java培训
这套教程是动力节点最新录制的CRM项目,课程主要针对核心的客户关系管理业务功能进行实现,让你能够深层掌握主流SSM框架、Linux操作系统下部署项目、数据库设计原则和技巧、数据如何通过图表在页面展示、Java对excel文件的处理,学会使用项目管理工具Maven、版本控制工具Git,以及缓存在项目中的运用熟悉前端开发技术及常见的特效等。 通过课程可以了解项目开发流程及项目开发各阶段主要文档及产出物
共69个视频
《腾讯云AI绘画-StableDiffusion图像生成》
学习中心
人工智能正在加速渗透到千行百业与大众生活中,个体、企业该如何面对新一轮的AI技术浪潮?为了进一步帮助用户了解和使用腾讯云AI系列产品,腾讯云AI技术专家与传智教育人工智能学科高级技术专家正在联合打造《腾讯云AI绘画-StableDiffusion图像生成》训练营,训练营将通过8小时的学习带你玩转AI绘画。并配有专属社群答疑,助教全程陪伴,在AI时代,助你轻松上手人工智能,快速培养AI开发思维。
领券