Python中利用ItsDangerous快捷实现数据加密
1. ItsDangerous简介
ItsDangerous是一个模块,可以用于给用户生成和验证数据的安全令牌,以保证数据的合法性和完整性。ItsDangerous采用激活、验证和签名等依次进行的方法来处理消息签名和序列化。
2. 安装ItsDangerous
ItsDangerous模块可以通过pip进行安装。
pip install itsdangerous
3. ItsDangerous使用指南
3.1 提供一个有限期的票据
使用ItsDangerous可以提供有限期的票据,票据内包含有关用户的信息,例如用户ID等,以便后续的数据处理,保证数据的有效性和时限性。
下面是一个简单的凭据生成和验证示例。
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer, BadSignature, SignatureExpired
# step1: 凭证生成
def generate_token(app, user):
# 设置过期时间seconds
s = Serializer(app.config['SECRET_KEY'], expires_in=86400)
return s.dumps({'id': user.id}).decode('utf-8')
# step2: 凭证校验
def verify_token(app, token):
s = Serializer(app.config['SECRET_KEY'])
try:
data = s.loads(token)
except SignatureExpired:
return None # Token已过期
except BadSignature:
return None # Token无效
user = User.query.get(data['id']) # 查询用户
return user
3.2 给数据签名
有时候,我们需要对我们的数据进行签名,以便在传输或存储时防止被篡改或修改。ItsDangerous可以通过使用固定密钥及签名算法来为数据生成签名。
下面是一个例子,用于为电子邮件生成签名。
from itsdangerous import URLSafeTimedSerializer
def send_confirmation_email(app, user):
token = user.generate_confirmation_token()
confirm_url = url_for('confirm_email', token=token, _external=True)
message_body = "Please click the link below to confirm your email address:\n{}".format(confirm_url)
subject = "Please Confirm Your Email"
send_email(user.email, subject, message_body)
class User(db.Model):
def __init__(self, **kwargs):
super(User, self).__init__(**kwargs)
self.confirmed = False
def generate_confirmation_token(self, expires_in=3600):
s = URLSafeTimedSerializer(app.config['SECRET_KEY'])
return s.dumps({'confirm': self.id}, salt=app.config['EMAIL_CONFIRM_SALT'])
def confirm(self, token):
s = URLSafeTimedSerializer(app.config['SECRET_KEY'])
try:
data = s.loads(token, salt=app.config['EMAIL_CONFIRM_SALT'], max_age=3600)
except:
return False
if data.get('confirm') != self.id:
return False
self.confirmed = True
db.session.add(self)
return True
4. 总结
使用ItsDangerous可以提供安全、高效的数据处理和合法性验证,确保数据的时效性和完整性。同时,ItsDangerous具有便捷、可配置的特性,可以适用于各种数据处理场景。
5. 示例一:以Flask和ItsDangerous实现token身份验证
Flask 提供了Flask-HTTPAuth
扩展,可以帮助我们轻松实现 token 身份验证。我们也可以不使用扩展,结合 Flask 和 ItsDangerous 实现 token 验证。
from flask import Flask, jsonify, g
from werkzeug.exceptions import Unauthorized
app = Flask(__name__)
app.config['SECRET_KEY'] = 'some secret key'
# 凭证生成
def generate_token(username):
s = Serializer(app.config['SECRET_KEY'], expires_in=600)
return s.dumps({'username': username}).decode('utf-8')
# 凭证校验
def verify_token(token):
s = Serializer(app.config['SECRET_KEY'])
try:
data = s.loads(token)
except SignatureExpired:
return None # Token已过期
except BadSignature:
return None # Token无效
user = User.query.filter_by(username=data['username']).first() # 校验用户是否存在
return user
@app.route('/login', methods=['POST'])
def login():
# 用户校验...
user = User.query.filter_by(username=username).first()
# 生成凭证
token = generate_token(user.username)
return jsonify({'token': token})
@app.route('/getinfo', methods=['GET'])
def getinfo():
token = request.headers.get('token') # 获取token
user = verify_token(token)
if user is None:
raise Unauthorized() # 返回401错误
# 返回user信息
return jsonify({'user': user.to_dict()})
if __name__ == '__main__':
app.run(debug=True)
6. 示例二:以itsdangerous实现token登录
from flask import Flask, request, jsonify
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer, SignatureExpired, BadSignature
app = Flask(__name__)
app.config['SECRET_KEY'] = "123456"
# 凭证生成
def generate_token(id, name):
s = Serializer(app.config['SECRET_KEY'], expires_in=600)
return s.dumps({'id': id, 'name': name}).decode('utf-8')
# 凭证校验
def verify_token(token):
s = Serializer(app.config['SECRET_KEY'])
try:
data = s.loads(token)
except SignatureExpired:
return False, 'Signature expired'
except BadSignature:
return False, 'Bad signature'
return True, data
@app.route('/login', methods=['POST'])
def login():
# 总之就是用户校验操作
if login_success:
token = generate_token(username, password)
return jsonify({'ret': 0, 'token': token})
else:
return jsonify({'ret': -1, 'msg': '用户名或密码错误'})
@app.route('/getuser', methods=['GET'])
def get_user():
token = request.headers.get('Authorization')
if token is None:
return jsonify({'ret': -1, 'msg': '缺少认证token'})
ok, user_info = verify_token(token)
if not ok:
return jsonify({'ret': -1, 'msg': user_info})
# 取出user id 查询用户的具体信息
user_id = user_info['id']
user_name = user_info['name']
user_dict = {"id": user_id, "name": user_name, "other_info": "..."}
return jsonify({'ret': 0, 'user_info': user_dict})
if __name__ == '__main__':
app.run(debug=True)
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python中利用ItsDangerous快捷实现数据加密 - Python技术站