我在做一个小项目。我有个教师的装饰师。使用我在登录页面上生成的JWT,允许它输入不同的根。我想要生成具有过期时间的JWT。但是有一个问题,我可以看到邮递员的过期时间,但在那个时间过去后我可以使用它。这是我的装饰师
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部分看到过期时间,但是即使在经过Postman:JWT=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImFkbWluQGFkbWluLmNvbSIsInBhc3N3b3JkIjoiYWRtaW4iLCJyb2xlIjoiYWRtaW4iLCJleHAiOjE2NjQyMDkyNTh9.HfanKS-2J50YteuhQg5x_gKQAOd1RPY0DDB64pyCxjU; Path=/; HttpOnly; Expires=Mon, 26 Sep 2022 16:20:58 GMT;之后,我也可以使用它
发布于 2022-09-24 14:08:38
看起来问题在于您正在使用datetime.now来生成时间戳。这将返回本地时间,但PyJWT 需要UTC时间戳。您可以使用datetime.utcnow获得UTC时间戳。
顺便说一句,您不应该在JWTs中包含敏感信息,例如密码。它们只被签名;它们没有加密。这意味着,任何能够看到JWT的人都可以读取敏感信息。
例如,我使用了在以下命令中发布的示例JWT的第二部分:
echo -n "eyJlbWFpbCI6ImFkbWluQGFkbWluLmNvbSIsInBhc3N3b3JkIjoiYWRtaW4iLCJyb2xlIjoiYWRtaW4iLCJleHAiOjE2NjQyMDkyNTh9" | base64 -d这提供了以下输出:
{"email":"admin@admin.com","password":"admin","role":"admin","exp":1664209258}这意味着密码对任何能够读取cookie的人都是可见的,cookie将出现在用户的浏览器中,可能出现在服务器日志中,如果用户不使用HTTPS,则可能在网络上可见。(使用安全cookie属性可以防止最后一种情况发生。)此外,还经常存在另一个漏洞使攻击者能够读取cookie的可能性。
https://stackoverflow.com/questions/73837617
复制相似问题