我已经在Django中构建了基于令牌的身份验证/权限系统(不使用REST Framework)。用户登录时,将使用以下代码生成JWT令牌-
token = jwt.encode({'user': email, 'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=48)}, settings.secret_key)
令牌作为响应的一部分发送到AngularJS前端,并存储在cookie中,并且用户导航到登录页面。当用户尝试访问网站上的任何其他页面时,令牌将作为请求授权标头的一部分发送,并在django后端中接收以由包装程序进行验证-
def token_required(f):
@wraps(f)
def decorated(request, *args, **kwargs):
token = None
print >> sys.stderr, settings.secret_key
try:
if request.META['HTTP_AUTHORIZATION']:
token = request.META['HTTP_AUTHORIZATION']
print("HTTP AUTH TOKEN: " + request.META['HTTP_AUTHORIZATION'])
else:
return Response().sendinvalidresponse('User is not Authorised. Please Login', 401)
except:
Response().senderrormail("Authentication.py", "token_required(f)")
return Response().sendinvalidresponse('Internal Error', 500)
if token:
try:
data = jwt.decode(token, settings.secret_key)
current_user = list(Q.generic_database_connect(Q.check_user_query, {'var_email': data['user']}))[0]
print >> sys.stderr, data
print >> sys.stderr, current_user
token = jwt.encode({'user': data['user'], 'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=48)}, settings.secret_key)
settings.token = token.decode('UTF-8')
except:
print "Token validity failed"
return Response().sendinvalidresponse('Token is invalid!', 401)
return f(current_user, request, *args, **kwargs)
else:
print "Token doesnt exist"
return Response().sendinvalidresponse('User is not Authorised. Please Login', 401)
return decorated
此包装器借助settings.secret_key
变量验证令牌,该变量目前已分配为常量字符串值。成功验证后,将刷新令牌exp,并将用户导航到请求的页面,并将更新的令牌存储在cookie中。
在单个客户端向Django服务器发送HTTP请求的情况下,此包装程序可以很好地工作。但是,在有多个客户端的情况下,有1个或多个客户端因尝试访问站点上的任何页面而被注销。控制台日志记录状态401响应,当令牌无法通过验证时将发送该响应。
有谁能建议在多个客户端向服务器发送带有令牌的请求的情况下为什么会发生这种情况?