【问题标题】:How to use refresh token with fastapi?如何在 fastapi 中使用刷新令牌?
【发布时间】:2020-10-06 08:51:08
【问题描述】:

我正在尝试在 fastapi 中找到使用 refresh token 的示例。 fastapidocs 提供了一个示例,说明如何创建具有有限生命周期的不记名令牌,但不提供如何刷新令牌。

flask 有 flask-jwt-extended,但没有找到类似 fastapi 的东西。

任何建议都将不胜感激!

【问题讨论】:

  • 我相信您的客户应该在一段时间后询问新令牌,或者只是在每次新请求时,使用新令牌扩展响应内容

标签: python python-3.x jwt fastapi


【解决方案1】:

您可能想查看fastapi-jwt-auth。它的灵感来自于 flask-jwt-extended。有一个很好的文档说明如何使用具有良好 examples 的刷新令牌。

首先你需要安装包: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}

在下一步中,您应该创建一个端点来刷新访问令牌。

@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"}

请注意,这只是从安全角度来看的一个小示例,您应该在刷新时交换刷新令牌并将旧令牌列入黑名单。因此库提供了装饰器@AuthJWT.token_in_denylist_loader。您可以使用内存数据库实现黑名单,该数据库保留无效的令牌,直到达到到期日期。同样在生产中选择一个真正的秘密。

【讨论】:

    【解决方案2】:

    我自己生成了token,根据本次请求和上次请求的时间间隔来判断是否刷新token,如果时间超过预定时间就更换token,同时通知前端保存新令牌

    【讨论】:

      猜你喜欢
      • 2021-01-29
      • 2021-01-03
      • 2021-06-19
      • 2020-07-12
      • 2019-06-23
      • 2021-11-23
      • 2017-10-25
      • 2016-09-23
      • 2014-09-13
      相关资源
      最近更新 更多