定时JSON web签名序列化程序是如何工作的



如果我生成这样的令牌,我是否可以将API的操作限制为特定用户:

from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
expiration = 600
s = Serializer(current_app.config['SECRET_KEY'], expires_in = expiration)
return s.dumps({ 'id': kwargs.get('user_id') })

以及验证

@staticmethod
    def verify_auth_token(token):
        s = Serializer(app.config['SECRET_KEY'])
        try:
            data = s.loads(token)
        except SignatureExpired:
            return None # valid token, but expired
        except BadSignature:
            return None # invalid token
        user = User.query.get(data['id'])
        return user

我不明白这是如何工作和实现安全的。例如,我用来保护API的方式是,用户想要对/posts/10执行HTTP PUT。我通常会获取帖子的作者ieuser_id,然后查询数据库以获取该user_id的令牌,如果请求令牌与查询的令牌匹配,则PUT

通过在登录时签署并发送原始令牌,服务器基本上为前端提供了用户可以访问的数据的所有访问票证,并且前端在所有未来的请求中使用该令牌(黄金票证),只要令牌未过期(可以使令牌过期或不过期)。服务器知道令牌没有被篡改,因为签名基本上是用户可识别数据(user_id、username等)的加密哈希。因此,如果您将令牌信息从以下内容更改:

{"user_id": 1}

类似于:

{"user_id": 2}

则签名将不同,并且服务器立即知道该令牌无效。

这提供了一种身份验证方法,使服务器不必拥有会话,因为它每次都会验证令牌。

下面是一个令牌的外观示例(其危险性可以使用这种格式的JSON web令牌)

最新更新