rus*_*ro1 8 python python-3.x jwt fastapi
我正在尝试找到在 fastapi中使用刷新令牌的示例。fastapi文档提供了一个示例,说明如何创建具有有限生命周期的不记名令牌,但没有提供如何刷新令牌的示例。
对于flask,有flask-jwt-extended,但没有找到类似fastapi 的东西。
任何建议将不胜感激 thx!
met*_*012 14
您可能想查看fastapi-jwt-auth。它的灵感来自于flask-jwt-extend。有一个很好的文档介绍了如何使用刷新令牌,并提供了很好的示例。
首先您需要安装软件包:pip install fastapi-jwt-auth
。并配置秘密。然后在登录时创建刷新令牌和访问令牌并将其返回给用户。
from fastapi import FastAPI, Depends, HTTPException
from fastapi_jwt_auth import AuthJWT
from pydantic import BaseModel
app = FastAPI()
class User(BaseModel):
email: str
password: str
class Settings(BaseModel):
authjwt_secret_key: str = "secret"
@AuthJWT.load_config
def get_config():
return Settings()
@app.post('/login')
def login(user: User, Authorize: AuthJWT = Depends()):
if user.email != "test@test.com" or user.password != "test":
raise HTTPException(status_code=401,detail="Incorrect email or password")
access_token = Authorize.create_access_token(subject=user.email)
refresh_token = Authorize.create_refresh_token(subject=user.email)
return {"access_token": access_token, "refresh_token": refresh_token}
Run Code Online (Sandbox Code Playgroud)
在下一步中,您应该创建一个端点来刷新访问令牌。
@app.post('/refresh')
def refresh(Authorize: AuthJWT = Depends()):
Authorize.jwt_refresh_token_required()
current_user = Authorize.get_jwt_subject()
new_access_token = Authorize.create_access_token(subject=current_user)
return {"access_token": new_access_token}
# Example protected Endpoint
@app.get('/hello')
def refresh(Authorize: AuthJWT = Depends()):
Authorize.jwt_required()
return {"hello": "world"}
Run Code Online (Sandbox Code Playgroud)
请注意,这只是从安全角度来看的一个小示例,您应该在刷新时交换刷新令牌并将旧令牌列入黑名单。因此图书馆提供了装饰器@AuthJWT.token_in_denylist_loader
。您可以使用内存数据库来实现黑名单,该数据库会保留无效的令牌,直到达到到期日期。还在生产中选择真正的秘密。