首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用pyJWT过期时间

使用pyJWT过期时间
EN

Stack Overflow用户
提问于 2022-09-24 13:33:50
回答 1查看 164关注 0票数 1

我在做一个小项目。我有个教师的装饰师。使用我在登录页面上生成的JWT,允许它输入不同的根。我想要生成具有过期时间的JWT。但是有一个问题,我可以看到邮递员的过期时间,但在那个时间过去后我可以使用它。这是我的装饰师

代码语言:javascript
复制
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

和登录页面:

代码语言:javascript
复制
@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;之后,我也可以使用它

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-24 14:08:38

看起来问题在于您正在使用datetime.now来生成时间戳。这将返回本地时间,但PyJWT 需要UTC时间戳。您可以使用datetime.utcnow获得UTC时间戳。

顺便说一句,您不应该在JWTs中包含敏感信息,例如密码。它们只被签名;它们没有加密。这意味着,任何能够看到JWT的人都可以读取敏感信息。

例如,我使用了在以下命令中发布的示例JWT的第二部分:

代码语言:javascript
复制
echo -n "eyJlbWFpbCI6ImFkbWluQGFkbWluLmNvbSIsInBhc3N3b3JkIjoiYWRtaW4iLCJyb2xlIjoiYWRtaW4iLCJleHAiOjE2NjQyMDkyNTh9" | base64 -d

这提供了以下输出:

代码语言:javascript
复制
{"email":"admin@admin.com","password":"admin","role":"admin","exp":1664209258}

这意味着密码对任何能够读取cookie的人都是可见的,cookie将出现在用户的浏览器中,可能出现在服务器日志中,如果用户不使用HTTPS,则可能在网络上可见。(使用安全cookie属性可以防止最后一种情况发生。)此外,还经常存在另一个漏洞使攻击者能够读取cookie的可能性。

(您可能也不应该将电子邮件作为用户可以更改它们。放在JWT中;最好像参考线那样使用唯一的用户ID。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73837617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档