Notion Blog
知行合一1 分钟阅读

fastapi实现jwt2.0加密解密

在 FastAPI 中实现 JWT(JSON Web Token)的加密和解密通常涉及以下几个步骤:

安装依赖:首先,你需要安装 PyJWT 库来处理 JWT 的编码和解码。

pip install pyjwt
创建 JWT 工具函数:你可以创建一些工具函数来生成和验证 JWT。
import jwt
from datetime import datetime, timedelta
from fastapi import HTTPException, status

# 密钥,用于签名和验证 JWT
SECRET_KEY = "your-secret-key"
ALGORITHM = "HS256"
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

# 生成 JWT
def create_jwt_token(data: dict, expires_delta: timedelta = None):
    to_encode = data.copy()
    if expires_delta:
        expire = datetime.utcnow() + expires_delta
    else:
        expire = datetime.utcnow() + timedelta(minutes=15)
    to_encode.update({"exp": expire})
    encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
    return encoded_jwt

# 验证 JWT
def verify_jwt_token(token: str=Security(oauth2_scheme)):
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
        return payload
    except jwt.ExpiredSignatureError:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Token has expired",
        )
    except jwt.InvalidTokenError:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Invalid token",
        )
在 FastAPI 中使用 JWT:你可以在 FastAPI 的路由中使用这些工具函数来处理
from fastapi import Depends, FastAPI, HTTPException
from fastapi.security import OAuth2PasswordBearer

app = FastAPI()

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

# 模拟用户数据
fake_users_db = {
    "johndoe": {
        "username": "johndoe",
        "password": "secret",
    }
}

# 登录路由,生成 JWT
@app.post("/token")
async def login(username: str, password: str):
    user = fake_users_db.get(username)
    if not user or user["password"] != password:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Incorrect username or password",
        )
    access_token_expires = timedelta(minutes=30)
    access_token = create_jwt_token(
        data={"sub": user["username"]}, expires_delta=access_token_expires
    )
    return {"access_token": access_token, "token_type": "bearer"}

# 受保护的路由,验证 JWT
@app.get("/protected")
async def protected_route(token: str = Depends(oauth2_scheme)):
    return {"username": payload["sub"]}
运行 FastAPI 应用:你可以使用 uvicorn 来运行你的 FastAPI 应用。

uvicorn main:app --reload

解释

create_jwt_token:这个函数用于生成 JWT。它接受一个字典 data 作为输入,并可以指定一个过期时间 expires_delta。JWT 会包含一个 exp 字段,表示令牌的过期时间。
verify_jwt_token:这个函数用于验证 JWT。如果令牌有效且未过期,它会返回解码后的 payload。如果令牌无效或已过期,它会抛出相应的异常。
/token 路由:这个路由用于用户登录并生成 JWT。它接受用户名和密码,验证用户信息,并生成一个 JWT。
/protected 路由:这个路由是受保护的,只有携带有效 JWT 的请求才能访问。它使用 OAuth2PasswordBearer 来自动提取并验证 JWT。

注意事项

密钥管理:在实际应用中,密钥 (SECRET_KEY) 应该妥善保管,不要硬编码在代码中。可以使用环境变量或密钥管理服务来管理密钥。
安全性:JWT 的安全性依赖于密钥的保密性。确保使用强密钥,并定期轮换密钥。
令牌过期:JWT 应该设置合理的过期时间,以防止令牌被长期滥用。

[table]

有关使用上的问题,欢迎您在底部评论区留言,一起交流~

读者评论

评论会同步写入该文在 Notion 中的页面底部(与正文同页,便于管理)。

0/1500

暂无评论,欢迎抢沙发。