如果我生成这样的令牌,我是否可以将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令牌)