基于Web2py JWT的身份验证 - 刷新令牌

Pik*_*Dey 0 python web2py

我正在尝试为基于Web2py构建的一些REST API实现基于令牌的身份验证.我使用的是2.14.6版(稳定版).如文档中所述,我按照这些步骤操作,并能够使用JWT从受身份验证的资源中验证和检索数据.我已完成以下步骤:

from gluon.tools import AuthJWT

myjwt = AuthJWT(auth, secret_key='secret', user_param="email")

def login_take_token():
    return myjwt.jwt_token_manager()

@myjwt.allows_jwt()
@auth.requires_login()
def get_my_service():
    my_code
Run Code Online (Sandbox Code Playgroud)

因此,使用此配置,我可以在调用函数"login_take_token"时获取令牌,并从"get_my_service"获取所需数据.以下是服务电话:

/app/controller/login_take_token?email=abc.com&password=abc123
Run Code Online (Sandbox Code Playgroud)

这给我们一个令牌说

/app/controller/get_my_service?_token=<TOKEN_RECEIVED>
Run Code Online (Sandbox Code Playgroud)

这会在成功登录时返回所需的预期数据.

我的问题是,正如web2py文档中所解释的,如果令牌过期,我们可以使用令牌并调用login_take_token以获取新的活动令牌.但是这个下面的调用不返回任何令牌,但只返回400 Bad Request,输出"Token is expired".

/app/controller/login_take_token?_token=<TOKEN_RECEIVED>
Run Code Online (Sandbox Code Playgroud)

如何使用旧令牌(已过期)进行调用以获取新令牌.

问候

Ant*_*ony 5

默认情况下,verify_expiration=True这意味着如果当前令牌已过期,您既不能验证也不能刷新令牌.如果要允许使用过期令牌进行刷新,则可以verify_expiration在请求刷新时有条件地更改(同时仍检查身份验证的到期时间):

def login_take_token():
    myjwt.verify_expiration = False # This will allow refresh with an expired token.
    return myjwt.jwt_token_manager()
Run Code Online (Sandbox Code Playgroud)

注意,还有一个附加参数,refresh_expiration_delta默认为60 * 60(即60分钟).如果发出原始令牌的时间大于refresh_expiration_delta,则刷新请求将被拒绝,并且需要重新进行身份验证以获取新令牌.

因此,默认过期时间为5分钟,默认刷新过期增量为60分钟,您可以获得最多12个刷新令牌,然后您将被迫重新进行身份验证(假设您每5分钟请求刷新一次).当然,refresh_expiration_delta如果要延长发布刷新令牌的时间,您可以设置更高的值.