📅  最后修改于: 2023-12-03 15:00:44.229000             🧑  作者: Mango
FastAPI 是一个现代、快速(高性能)的 Web 框架,基于 Python 3.6+ 语法标准,并采用 type hints,实现了极快的编码和自动文档化。FastAPI 还提供了内置的、快速并发的运行时 Starlette 和 Pydantic 等库,有效减少了开发所需的时间和复杂性。
身份验证在 Web 应用中常常扮演着重要的角色,而 FastAPI 可以轻松地实现身份验证功能,保证您的 Web 应用的安全性。本文将介绍如何使用 FastAPI 实现身份验证功能。
JWT 是一种开放标准,在用户和服务器之间传递安全信息的一种简洁、独立、安全的方式。JWT 在应用场景中广泛应用,因为它可通过签名验证证明信息来源的合法性,并且因为它使用了标准的加密算法,所以可以保证传输过程中的信息安全。
使用 JWT 在 FastAPI 中实现身份验证需要安装 PyJWT
库,您可以使用以下命令进行安装:
pip install PyJWT
以下是 JWT 的工作原理:
1.用户在使用凭据(如用户名和密码)进行身份验证后,服务器会根据相关的信息生成一个JWT Token 并返回给用户。
2.用户使用携带 JWT 的请求访问服务器。
3.服务器通过 Token 获取到 JWT,并检查是否能够被正确解码和验证。
4.若 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 实现身份验证功能:
定义了一个 secret key 和 algorithm 用于创建和解码 JWT。
创建 create_access_token()
函数用于生成 Token。
定义一个简单的 users_db 字典,记录了用户的信息(在实际应用中,您需要使用数据库或其他持久性存储存储用户信息)。
定义了 /login
路径,用于验证用户的身份并返回 Token。
定义了 /
路径,使用 HTTPBearer()
实例化一个 Security 对象,使用 HTTPAuthorizationCredentials
类型的参数来接收传送 Token。
以上就是使用 FastAPI 和 PyJWT 实现 JWT 身份验证的示例代码,您可以根据自己的需求,对以上示例代码进行修改和完善。
FastAPI 提供了方便的身份验证功能,它允许我们对我们的应用进行更多层次的安全验证,增加安全性。同时,JWT 也提供了一种安全的轻量级身份验证机制,可以用于各种应用场景。如果您正在寻找一种可靠和安全的身份验证机制,不妨使用 FastAPI 和 PyJWT。