fastapi jwt
时间: 2023-06-10 09:07:54 浏览: 302
FastAPI是一个用Python编写的现代Web框架,它提供了高性能和易用性的优点。JWT(JSON Web Token)是一种在网络应用中传递信息的加密方式,它使用JSON对象作为安全令牌。
在FastAPI中使用JWT,你需要先安装PyJWT(Python JWT库)。然后,你需要定义一个JWT密钥(secret key),用于对JWT进行签名和解密。你可以在FastAPI的应用程序中定义一个全局的密钥,或者在每个路由中定义不同的密钥。
接下来,你需要编写一个认证函数,它会在每个请求中验证JWT令牌。如果令牌验证成功,你可以将请求传递给下一个处理程序。否则,你可以返回一个HTTP 401 Unauthorized错误。
最后,你需要在每个需要进行身份验证的路由中添加一个装饰器。这个装饰器将会在路由处理程序之前运行认证函数。
下面是一个使用FastAPI和JWT进行身份验证的示例:
```python
from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
import jwt
from jwt import PyJWTError
app = FastAPI()
JWT_SECRET_KEY = "mysecretkey"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/token")
def verify_token(token: str):
try:
payload = jwt.decode(token, JWT_SECRET_KEY, algorithms=[ALGORITHM])
username = payload.get("sub")
if username is None:
raise HTTPException(status_code=401, detail="Invalid authentication credentials")
except PyJWTError:
raise HTTPException(status_code=401, detail="Invalid authentication credentials")
@app.post("/token")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
# Your authentication logic here
access_token = jwt.encode({"sub": form_data.username}, JWT_SECRET_KEY, algorithm=ALGORITHM)
return {"access_token": access_token, "token_type": "bearer"}
@app.get("/protected")
async def protected_route(token: str = Depends(oauth2_scheme)):
verify_token(token)
return {"message": "Hello World"}
```
在这个示例中,我们定义了一个JWT_SECRET_KEY和一个ALGORITHM,用于对JWT进行签名和解密。我们还定义了一个ACCESS_TOKEN_EXPIRE_MINUTES,用于设置访问令牌的过期时间。
我们使用FastAPI的OAuth2PasswordBearer类定义了一个oauth2_scheme,用于获取请求中的JWT令牌。
我们编写了一个verify_token函数,它用于验证JWT令牌的有效性。如果令牌验证失败,我们将抛出一个HTTP 401 Unauthorized错误。
我们使用FastAPI的Depends装饰器来定义一个依赖项,它将会在每个需要进行身份验证的路由中运行。这个依赖项会调用oauth2_scheme来获取JWT令牌,并将其传递给verify_token函数进行验证。
最后,我们定义了一个/login路由,用于用户登录并生成JWT令牌。我们还定义了一个/protected路由,它需要进行身份验证才能访问。
阅读全文