【发布时间】:2019-03-26 17:54:16
【问题描述】:
我正在尝试使用在 python django 中构建 Json Web 令牌 pyjwt library 参考 stackoverflow 中 Madhu_Kiran_K 的建议 link
在下面的代码中,我正在尝试生成一个 JSON Web 令牌,用于存储此用户的 ID、电子邮件,并将到期日期设置为未来 2 天。 我可以成功地对令牌进行编码和解码,以获得所有必需的用户信息和令牌过期时间。
我现在的要求:
1.)请问我如何验证并确保客户端发送的令牌仍然有效,因此不会被篡改。
2.)如何检查过期时间并打印消息。 这是我为此所做的工作
#check if the token were tampered
if content['user_id'] =='' or content['email'] == '':
print("Invalid Token")
else:
print("Token is still valid")
#check if token has expired after 2 days
if content['exp'] > dt:
print("Token is still active")
else:
print("Token expired. Get new one")
时间到期检查返回 int 和 datetime.datetime 实例之间不支持的错误消息。什么是正确的验证方法。谢谢
以下是完整代码
#!/usr/bin/python
import sys
import re
import json
from datetime import datetime, timedelta
import jwt
#https://www.guru99.com/date-time-and-datetime-classes-in-python.html
#timedelta(days=365, hours=8, minutes=15)
#'exp': int(dt.strftime('%s'))
dt = datetime.now() + timedelta(days=2)
encoded_token = jwt.encode({'user_id': "abc", 'email': "nancy@gmail.com", 'exp': dt }, 'MySECRET goes here', algorithm='HS256')
print(encoded_token)
#decode above token
decode_token=jwt.decode(encoded_token, 'MySECRET goes here', algorithms=['HS256'])
content = decode_token
print(content)
print(content['user_id'])
print('json token successfully retrieved')
if content['user_id'] =='' or content['email'] == '':
print("Invalid Token")
else:
print("Token is still valid")
#check if token has expired after 2 days
if content['exp'] > dt:
print("Token is still active")
else:
print("Token expired. Get new one")
【问题讨论】:
-
为确保不被篡改,您可以使用安全的散列算法,例如 SHA-256。要检查时间,您不希望使用
dt,因为当您重新启动脚本时,dt将在未来出现,理想情况下您会希望使用dt来构建 json 对象,但检查它应该依赖在今天的日期。只是一些想法可能会引导您朝着正确的方向前进 -
为了检查令牌是否有效,您不应该将当前令牌与最初提供给用户的令牌进行比较吗?我想我帮不上忙,我只是觉得你的问题很有趣。
-
@MooingRawr:不确定你在说什么
dt,但这似乎没有多大意义。jwt.encode()支持输入字典中的exp到期日期,在再次解码时为您检查。 -
@Reez0:不需要手动检查令牌,因为它使用了数字签名。