使用pyJWT过期时间

alen0pnh  于 2022-11-07  发布在  Postman
关注(0)|答案(1)|浏览(197)

我正在做一个小项目。我有一个教师的装饰器。我在登录页面上生成的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;

eiee3dmh

eiee3dmh1#

看起来问题出在您使用datetime.now来生成时间戳。这将返回本地时间,但PyJWT需要UTC时间戳。您可以使用datetime. utcnow来获取UTC时间戳。
顺便说一句,您不应该在JWT中包含敏感信息,例如密码。这意味着任何可以看到JWT的人都可以读取这些敏感信息。
例如,我使用了您在以下命令中发布的示例JWT的第二部分:

echo -n "eyJlbWFpbCI6ImFkbWluQGFkbWluLmNvbSIsInBhc3N3b3JkIjoiYWRtaW4iLCJyb2xlIjoiYWRtaW4iLCJleHAiOjE2NjQyMDkyNTh9" | base64 -d

这会产生下列输出:

{"email":"admin@admin.com","password":"admin","role":"admin","exp":1664209258}

这意味着任何可以读取cookie的人都可以看到密码,cookie将出现在用户的浏览器中,可能出现在服务器日志中,如果用户没有使用HTTPS,则可能在网络上可见。(使用“安全cookie”属性可以防止后一种情况。)也始终存在另一个漏洞使攻击者能够读取cookie的可能性。
(You可能也不应该将电子邮件放在JWT中,如users may change them;最好使用唯一的用户ID,如GUID。)

相关问题