如何在 fastapi 中使用刷新令牌?

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。您可以使用内存数据库来实现黑名单,该数据库会保留无效的令牌,直到达到到期日期。还在生产中选择真正的秘密。

  • repo 自 2020 年以来一直没有更新,为了解决一些问题,例如 [this](https://github.com/IndominusByte/fastapi-jwt-auth/issues/98),您最终可能会降级 fastapi 和 pydantic 版本 (2认同)