python - 如何在 Python JWT 中 token 过期时提取 JWT token 有效负载

标签 python flask jwt backend

Python JWT 包中的 JWT token 过期后,我无法提取 JWT token 负载。 我使用flask API进行后端开发,实现在中间件中。

下面是我的代码:

import jwt
from flask import request
from functools import wraps
from werkzeug.exceptions import Forbidden, Unauthorized

def admin_rights_required(f):
    @wraps(f)
    def _decorated(*args, **kwargs):
        config = readConfig()
        secretKey = config["JWT_SECRET_KEY"]
        algorithm = config["JWT_ENCODING_ALGORITHM"]
        token = None
        if "Authorization" in request.headers:
            data = request.headers["Authorization"]
            token = str.replace(str(data), "Bearer ", "")
        try:
            if not token or (not _ruleUserObj.getRuleUserFromToken(token)):
                data = jwt.decode(token, secretKey, algorithms=algorithm)
                raise Unauthorized("Token is missing")
            data = jwt.decode(token, secretKey, algorithms=algorithm)
            if getTokenDurationDifference(token) == -1:
                raise jwt.InvalidTokenError
            currentUser = _ruleUserObj.getRuleUser(data["sub"]["username"])
            if not len(currentUser) > 0:
                raise jwt.InvalidTokenError
            if currentUser["isAdmin"] == False:
                raise Forbidden()
        except jwt.ExpiredSignatureError:
            _ruleUserObj.updatedRuleUserSessionRemToken(data["sub"]["username"])
            raise Unauthorized("Signature expired. Please log in again.")
        except jwt.InvalidTokenError:
            _ruleUserObj.updatedRuleUserSessionRemToken(data["sub"]["username"])
            raise Unauthorized("Invalid token. Please log in again.")

        return f(*args, **kwargs)

    return _decorated

最佳答案

我在python的jwt包中找到了解决方案。以下是引用链接: https://pyjwt.readthedocs.io/en/latest/usage.html#reading-the-claimset-without-validation

以下是我对上述内容所做的代码更改:

jwt.decode(
                        token,
                        secretKey,
                        algorithms=algorithm,
                        options={"verify_signature": False},
                    )
                )["sub"]["username"]
            )

将代码与主代码合并后,如下所示:

import jwt
from flask import request
from functools import wraps
from werkzeug.exceptions import Forbidden, Unauthorized

def admin_rights_required(f):
    @wraps(f)
    def _decorated(*args, **kwargs):
        config = readConfig()
        secretKey = config["JWT_SECRET_KEY"]
        algorithm = config["JWT_ENCODING_ALGORITHM"]
        token = None
        if "Authorization" in request.headers:
            data = request.headers["Authorization"]
            token = str.replace(str(data), "Bearer ", "")
        try:
            if not token or (not _ruleUserObj.getRuleUserFromToken(token)):
                data = jwt.decode(token, secretKey, algorithms=algorithm)
                raise Unauthorized("Token is missing")
            data = jwt.decode(token, secretKey, algorithms=algorithm)
            if getTokenDurationDifference(token) == -1:
                raise jwt.InvalidTokenError
            currentUser = _ruleUserObj.getRuleUser(data["sub"]["username"])
            if not len(currentUser) > 0:
                raise jwt.InvalidTokenError
            if currentUser["isAdmin"] == False:
                raise Forbidden()
        except jwt.ExpiredSignatureError:
            _ruleUserObj.updatedRuleUserSessionRemToken(
                (
                    jwt.decode(
                        token,
                        secretKey,
                        algorithms=algorithm,
                        options={"verify_signature": False},
                    )
                )["sub"]["username"]
            )
            raise Unauthorized("Signature expired. Please log in again.")
        except jwt.InvalidTokenError:
            _ruleUserObj.updatedRuleUserSessionRemToken(
                (
                    jwt.decode(
                        token,
                        secretKey,
                        algorithms=algorithm,
                        options={"verify_signature": False},
                    )
                )["sub"]["username"]
            )
            raise Unauthorized("Invalid token. Please log in again.")

        return f(*args, **kwargs)

    return _decorated

如果 jwt token 过期,还有另一种方法可以对其进行解码: 正如@KlausD 所建议的。下面是实现:

import base64
import json
tokenSplit = token.split(".")
json.loads((base64.b64decode(tokenSplit[1])).decode("utf-8"))

感谢@KlausD。对于简单的黑客

关于python - 如何在 Python JWT 中 token 过期时提取 JWT token 有效负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69933118/

相关文章:

jwt - JWT 是否可以两次生成相同的 token ?

python - Pyinstaller:生成-exe文件+文件夹(在--onefile模式下)

python - 使用 pandas 从 txt 加载数据

python - 当只应该存在一个窗口时,Tkinter 在使用多重处理选择文件时打开多个 GUI 窗口

flask - 如何从 jinja 宏在 flask 上下文中设置变量?

python - 如何限制用户可以上传到我的表单的文件类型?

python - 属性错误: 'Flask' object has no attribute 'login_manager' -- Login_Manager

python - 自定义类型的对象作为字典键

java - 如何在java中为每个请求使用JSON Web Token (JWT)?

c# - .Net Core IsAuthenticated false 即使我手动使用 HttpContext.SignInAsync