我正在做一个小项目。我有一个教师的装饰器。我在登录页面上生成的JWT允许输入不同的根。我想生成一个有过期时间的JWT。但是有一个问题,我可以在Postman中看到过期时间,但是我可以在过期时间过后使用它。这是我的装饰器
def teachers():
def wrapper(f):
@wraps(f)
def decorator(*args,**kwargs):
token = request.headers["Authorization"]
token = str.replace(str(token), 'Bearer ', '')
try:
data = jwt.decode(token, "testing",algorithms=["HS256"])
print("Token is still valid and active")
except jwt.ExpiredSignatureError:
print("Token expired. Get new one")
except jwt.InvalidTokenError:
print("Invalid Token")
if data['role'] == "teacher" or data['email'] == "admin@admin.com" :
return f(*args,**kwargs)
else:
return jsonify({"message": "Authentication failed"})
return decorator
return wrapper
和登录页面:
@app.route('/teacherlogin', methods=['POST'])
def teacherlogin():
email = request.form["email"]
password = request.form["password"]
role = request.form["role"]
dt=datetime.now()+timedelta(seconds=120)
try:
user = users.find({"$and": [{"email": email}, {"role": role}]})[0]
except IndexError:
return jsonify({"User not found"})
hashed_pw = user["password"]
if bcrypt.hashpw(password.encode('utf8'), hashed_pw) == hashed_pw:
token = jwt.encode({
'email': email,
'password': password,
'role': role,
'exp':dt
}, app.config['SECRET_KEY'])
res = make_response("Successful", 200)
res.set_cookie(
"JWT",
value=token,
expires=dt,
httponly=True)
return res
else:
return jsonify({"error": "Wrong password"})
我可以在Postman Cookie部分看到过期时间,但即使在此时间过后,我仍可以使用它Postman Cookie:JWT=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImFkbWluQGFkbWluLmNvbSIsInBhc3N3b3JkIjoiYWRtaW4iLCJyb2xlIjoiYWRtaW4iLCJleHAiOjE2NjQyMDkyNTh9.HfanKS-2J50YteuhQg5x_gKQAOd1RPY0DDB64pyCxjU; Path=/; HttpOnly; Expires=Mon, 26 Sep 2022 16:20:58 GMT;
1条答案
按热度按时间eiee3dmh1#
看起来问题出在您使用datetime.now来生成时间戳。这将返回本地时间,但PyJWT需要UTC时间戳。您可以使用datetime. utcnow来获取UTC时间戳。
顺便说一句,您不应该在JWT中包含敏感信息,例如密码。这意味着任何可以看到JWT的人都可以读取这些敏感信息。
例如,我使用了您在以下命令中发布的示例JWT的第二部分:
这会产生下列输出:
这意味着任何可以读取cookie的人都可以看到密码,cookie将出现在用户的浏览器中,可能出现在服务器日志中,如果用户没有使用HTTPS,则可能在网络上可见。(使用“安全cookie”属性可以防止后一种情况。)也始终存在另一个漏洞使攻击者能够读取cookie的可能性。
(You可能也不应该将电子邮件放在JWT中,如users may change them;最好使用唯一的用户ID,如GUID。)