如何在FastAPI中使用JWT令牌进行身份验证和授权

简介:
随着Web应用程序的发展,用户身份验证和授权成为了一个至关重要的部分。使用JWT(JSON Web Token)令牌可以方便地实现身份验证和授权功能。 FastAPI是一个基于Python的现代Web框架,它提供了简单易用的功能来处理身份验证和授权。本文将介绍如何在FastAPI中使用JWT令牌进行身份验证和授权。

  1. 安装依赖库
    首先,我们需要安装一些依赖库,包括FastAPI、PyJWT和Passlib。可以使用pip命令进行安装:
pip install fastapi
pip install pyjwt
pip install passlib
登录后复制
  1. 生成秘钥
    我们需要生成一个用于签署和验证JWT令牌的秘钥。可以使用以下代码生成秘钥:
import secrets

secret_key = secrets.token_urlsafe(32)
登录后复制
  1. 创建用户模型
    在FastAPI中,我们需要定义一个用户模型来表示应用程序中的用户。可以使用以下代码创建用户模型:
from pydantic import BaseModel

class User(BaseModel):
    username: str
    password: str
登录后复制
  1. 创建路由和处理函数
    接下来,我们需要创建路由和处理函数来处理用户的身份验证和授权请求。可以使用以下代码创建路由和处理函数:
from fastapi import FastAPI, HTTPException
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from passlib.context import CryptContext
from datetime import datetime, timedelta
import jwt

app = FastAPI()

pwd_context = CryptContext(schemes=["bcrypt"])
security = HTTPBearer()

# 模拟数据库中的用户
users_db = {
    "admin": {
        "username": "admin",
        "password": pwd_context.hash("admin123")
    }
}

@app.post("/login")
def login(user: User):
    if user.username not in users_db:
        raise HTTPException(status_code=401, detail="Invalid username")
    
    stored_user = users_db[user.username]
    if not pwd_context.verify(user.password, stored_user["password"]):
        raise HTTPException(status_code=401, detail="Invalid password")
    
    token = generate_token(user.username)
    return {"access_token": token}

def generate_token(username: str) -> str:
    expiration = datetime.utcnow() + timedelta(minutes=30)
    payload = {"username": username, "exp": expiration}
    return jwt.encode(payload, secret_key, algorithm="HS256")

@app.get("/users/me")
def get_user_profile(credentials: HTTPAuthorizationCredentials = security):
    token = credentials.credentials
    try:
        payload = jwt.decode(token, secret_key, algorithms=["HS256"])
        username = payload["username"]
        if username not in users_db:
            raise HTTPException(status_code=401, detail="Invalid username")
        
        return {"username": username}
    except jwt.DecodeError:
        raise HTTPException(status_code=401, detail="Invalid token")
登录后复制
  1. 测试功能
    现在,我们可以使用Postman或其他HTTP客户端工具来测试我们的功能。首先,我们需要使用POST请求发送登录请求,并在请求体中包含用户名和密码。如下所示:

请求URL:http://localhost:8000/login
请求体:

{
    "username": "admin",
    "password": "admin123"
}
登录后复制

成功登录后,我们将收到一个包含访问令牌的响应。例如:

{
    "access_token": "xxxxxxxxxxxxx"
}
登录后复制

然后,我们可以使用GET请求发送获取用户资料的请求,将访问令牌作为Authorization头部的Bearer令牌发送。如下所示:

请求URL:http://localhost:8000/users/me
请求头部:Authorization: Bearer xxxxxxxxxxxxx

如果令牌验证成功,响应将返回一个包含用户名的JSON对象。例如:

{
    "username": "admin"
}
登录后复制

结束语:
本文介绍了如何在FastAPI中使用JWT令牌进行身份验证和授权。通过使用PyJWT库,我们生成了JWT令牌,并使用Passlib库进行密码哈希验证。使用这种方法,我们可以轻松地实现用户身份验证和授权功能,从而保护我们的Web应用程序。

以上就是如何在FastAPI中使用JWT令牌进行身份验证和授权的详细内容,更多请关注Work网其它相关文章!

08-21 23:29