每次django服务器重新启动时,刷新令牌都会失效



我在django rest+reactjs应用程序中使用简单的jwt令牌进行身份验证。和往常一样,我在react前端使用axios拦截器来检查访问令牌是否已过期,如果是,则它首先向令牌刷新api发送请求,以获取新的令牌对。

我现在注意到的问题是,假设我在django中对代码进行了一些更改,并且服务器在保存后重新启动,刷新令牌将无效,因此下次如果拦截器向刷新api发出请求,它将抛出以下错误

{
"detail": "Token is invalid or expired",
"code": "token_not_valid"
}

因此,每次重新启动服务器后,我都必须注销用户。

以下是简单的jwt设置


INSTALLED_APPS=[
"rest_framework",
'rest_framework_simplejwt',
'rest_framework_simplejwt.token_blacklist',
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (

'rest_framework_simplejwt.authentication.JWTAuthentication',
)
}
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=1),
'REFRESH_TOKEN_LIFETIME': timedelta(days=7),
'ROTATE_REFRESH_TOKENS': True,
'BLACKLIST_AFTER_ROTATION': True,
'UPDATE_LAST_LOGIN': True,
'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',
'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5),
'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),
}

在一次又一次地查看代码后,我意识到简单的jwt设置没有错,但问题实际上出在其他地方。问题是SECRET_KEY

我应该从.env文件中获得密钥值,我为该文件编写了代码

SECRET_KEY = os.environ.get("DJANGO_SECRET_KEY", get_random_secret_key())

上面的代码意味着,如果在.env文件中的DJANGO_SECRET_KEY中找到一个值,则使用get_random_SECRET_KEY((生成随机密钥。我犯的错误是在.env文件中,我没有将变量名声明为DJANGO_SECRET_KEY=ahhjkhjds,而是将变量声明为SECRET_KEY=ahhjkhjds。所以,这是在做什么,因为os.envrion.get没有得到DJANGO_SECRET_KEY的值,它在get_random_SECRET_KEY((的帮助下每次重新加载服务器时都会生成一个新的密钥

这种直觉影响了简单jwt设置中的设置,即

SIMPLE_JWT= {
'SIGNING_KEY': SECRET_KEY,
}

因此,基本上,每次服务器因为SECRET_KEY有了新值而重新加载时,SIGNING_KEY的值都会发生变化。因此,旧的刷新令牌变得无效,即使它没有过期,因为它的SIGNING_KEY值与当前值不匹配。

因此,当我尝试在新的访问令牌与已经生成的刷新令牌过期后获取它时,我得到了错误Token is invalid or expired

最新更新