如果我生成这样的令牌,我可以将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的方式,例如,用户想要 HTTP PUT 到/ posts / 10我通常会得到帖子的作者,即 user_id 然后查询数据库获取该user_id的令牌,如果请求令牌与查询的令牌匹配,那么 PUT 是安全的。我已经阅读了这个article并且没有完全理解它如何在不将任何内容存储在数据库中的情况下实现安全性。有人能解释它是如何工作的吗?
答案 0 :(得分:3)
通过在登录时签署并发送原始令牌,服务器基本上为前端提供了用户可以访问的数据的所有访问权限,并且前端在将来的所有请求中使用该令牌(黄金票证)令牌未过期(令牌可以有效期)。服务器反过来知道令牌没有被篡改,因为签名基本上是用户可识别数据(user_id,用户名等)的加密哈希。因此,如果您从以下内容更改令牌信息:
"conversations": {
"JamesTest": {
"name": "JamesTest",
"url": "myngrok",
"fulfillmentApiVersion": 2
}
}
类似于:
{"user_id": 1}
然后签名会有所不同,服务器立即知道此令牌无效。
这提供了一种身份验证方法,可以使服务器不必拥有会话,因为它每次都会验证令牌。
Here是令牌可能的示例(itsdangerous可以使用此格式的JSON网络令牌)