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

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

问题描述:

我试图实现基于令牌的身份验证,对Web2py上构建的一些REST API。我正在使用版本2.14.6(稳定)。正如文档中提到的,我遵循了这些步骤,并能够使用JWT验证和检索受认证保护的资源中的数据。我也做了以下步骤:Web2py基于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 

所以用这个配置,我可以打了一个电话的功能“login_take_token”,也从“get_my_service”获取所需的数据时,得到的令牌。下面是服务电话:

/app/controller/login_take_token?email=abc.com&password=abc123 

这将返回美国令牌说

/app/controller/get_my_service?_token=<TOKEN_RECEIVED> 

这将返回我们成功登录所需的预期数据。

我的问题是,正如web2py文档中所解释的,如果令牌已过期,那么我们可以使用该令牌并致电login_take_token以获取新的活动令牌。但是,这下面的调用不会返回任何标记,但只返回400错误请求,输出“令牌已过期”。

/app/controller/login_take_token?_token=<TOKEN_RECEIVED> 

应该如何与旧令牌(已过期)进行呼叫以获取新令牌。

问候

默认情况下,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() 

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

因此,默认的过期时间为5分钟,默认刷新过期增量为60分钟,在强制重新进行身份验证之前,您最多可以获得12个刷新令牌(假设您每隔5分钟要求刷新一次)。当然,如果您想延长刷新令牌的发放期限,您可以将refresh_expiration_delta设置为更高的值。