📜  fastapi 身份验证 - Python (1)

📅  最后修改于: 2023-12-03 15:00:44.229000             🧑  作者: Mango

FastAPI 身份验证 - Python

FastAPI 是一个现代、快速(高性能)的 Web 框架,基于 Python 3.6+ 语法标准,并采用 type hints,实现了极快的编码和自动文档化。FastAPI 还提供了内置的、快速并发的运行时 Starlette 和 Pydantic 等库,有效减少了开发所需的时间和复杂性。

身份验证在 Web 应用中常常扮演着重要的角色,而 FastAPI 可以轻松地实现身份验证功能,保证您的 Web 应用的安全性。本文将介绍如何使用 FastAPI 实现身份验证功能。

JWT(JSON Web Token)

JWT 是一种开放标准,在用户和服务器之间传递安全信息的一种简洁、独立、安全的方式。JWT 在应用场景中广泛应用,因为它可通过签名验证证明信息来源的合法性,并且因为它使用了标准的加密算法,所以可以保证传输过程中的信息安全。

使用 JWT 在 FastAPI 中实现身份验证需要安装 PyJWT 库,您可以使用以下命令进行安装:

pip install PyJWT

以下是 JWT 的工作原理:

1.用户在使用凭据(如用户名和密码)进行身份验证后,服务器会根据相关的信息生成一个JWT Token 并返回给用户。

2.用户使用携带 JWT 的请求访问服务器。

3.服务器通过 Token 获取到 JWT,并检查是否能够被正确解码和验证。

4.若 JWT 能够成功解码和验证,服务器会验证 JWT 中包含的权限和有效期等信息,如果都符合要求,则返回请求的数据或资源。

实现 JWT 身份验证

以下是使用 FastAPI 和 PyJWT 实现 JWT 身份验证的示例代码:

from fastapi import FastAPI, HTTPException
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from datetime import datetime, timedelta
import jwt

SECRET_KEY = "my_secret_key"  # 密钥
ALGORITHM = "HS256"          # 算法
ACCESS_TOKEN_EXPIRE_MINUTES = 30  # Token 的过期时间(分钟)

app = FastAPI()

security = HTTPBearer()

users_db = {
    'test@example.com': 'password'
}

@app.post('/login')
def login(data: dict):
    email = data['email']
    password = data['password']
    if email not in users_db or password != users_db[email]:
        raise HTTPException(status_code=400, detail="Incorrect email or password")
    access_token = create_access_token(data={"sub": email})
    return {"access_token": access_token, "token_type": "bearer"}

def create_access_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=ACCESS_TOKEN_EXPIRE_MINUTES)
    to_encode.update({"exp": expire})
    encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
    return encoded_jwt

@app.get('/')
def index(credentials: HTTPAuthorizationCredentials = security):
    token = credentials.credentials
    try:
        jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
        return {'message': 'Hello World!'}
    except Exception as e:
        raise HTTPException(status_code=401, detail=str(e))

以上代码演示了如何使用 JWT 实现身份验证功能:

  1. 定义了一个 secret key 和 algorithm 用于创建和解码 JWT。

  2. 创建 create_access_token() 函数用于生成 Token。

  3. 定义一个简单的 users_db 字典,记录了用户的信息(在实际应用中,您需要使用数据库或其他持久性存储存储用户信息)。

  4. 定义了 /login 路径,用于验证用户的身份并返回 Token。

  5. 定义了 / 路径,使用 HTTPBearer() 实例化一个 Security 对象,使用 HTTPAuthorizationCredentials 类型的参数来接收传送 Token。

以上就是使用 FastAPI 和 PyJWT 实现 JWT 身份验证的示例代码,您可以根据自己的需求,对以上示例代码进行修改和完善。

总结

FastAPI 提供了方便的身份验证功能,它允许我们对我们的应用进行更多层次的安全验证,增加安全性。同时,JWT 也提供了一种安全的轻量级身份验证机制,可以用于各种应用场景。如果您正在寻找一种可靠和安全的身份验证机制,不妨使用 FastAPI 和 PyJWT。