问题描述
我制作了一个定制的JWT身份验证系统,该系统将刷新令牌存储在cookie中,并将访问令牌存储为json格式。由于访问令牌的寿命很短,因此理想情况下,需要通过进行刷新api调用来刷新令牌。我已经进行了api调用。
但是我想要的是,会话除了访问令牌的过期时间外,一旦进行了另一个API调用,访问令牌的过期时间就会刷新。
最后,当刷新令牌到期时,或者两次API调用之间有足够的空闲时间,足以使访问令牌到期,我应该分别使用Sign in again
或refresh access token function
。
这些是我使用过的功能:
获取刷新令牌
def generate_refresh_token(user):
refresh_token_payload = {
'user_id': user.id,'exp': datetime.datetime.utcNow() + datetime.timedelta(days=1),'iat': datetime.datetime.utcNow()
}
refresh_token = jwt.encode(
refresh_token_payload,REFRESH_TOKEN_SECRET,algorithm='HS256').decode('utf-8')
return refresh_token
def generate_access_token(user,refresh_token):
if not refresh_token:
raise exceptions.PermissionDenied('No refresh token provided')
else:
access_token_payload = {
'user_id': user.id,'exp': datetime.datetime.utcNow() + datetime.timedelta(days=0,minutes=20),'iat': datetime.datetime.utcNow(),}
access_token = jwt.encode(access_token_payload,settings.SECRET_KEY,algorithm='HS256').decode('utf-8')
return access_token
用于手动刷新访问令牌的功能
路径:localhost:8000/api/token/refresh/
@api_view(['POST'])
@permission_classes([AllowAny])
def token_refresh(request):
Account = get_user_model()
refresh_token = request.COOKIES.get('refreshtoken')
print(refresh_token)
response = Response()
payload = jwt.decode(refresh_token,algorithms=['HS256'])
user = Account.objects.filter(id=payload['user_id']).first()
access_token = generate_access_token(user,refresh_token)
# serialized_user = SignInSerializer(user).data
response.data = {
'access_token': access_token,'id': user.id
}
return response
我觉得在每个函数/方法的开头都调用此函数会很麻烦。有什么有效的方法可以实现这一过程吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)