Flask中的JWT认证构建安全的用户身份验证体系(1)

立山  金牌会员 | 2024-8-10 23:45:45 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 579|帖子 579|积分 1737

进一步示例代码

用户管理

在用户管理方面,我们可以扩展我们的示例代码以支持用户注册、管理和密码重置。下面是一个简单的示例:
  1. # 用户数据库
  2. users = {
  3.     'username': {'password': 'hashed\_password', 'email': 'user@example.com'}
  4. }
  5. # 注册路由
  6. @app.route('/register', methods=['POST'])
  7. def register():
  8.     data = request.get_json()
  9.     username = data.get('username')
  10.     password = data.get('password')
  11.     email = data.get('email')
  12.     if username in users:
  13.         return jsonify({'message': 'Username already exists!'}), 400
  14.     # 在实际应用中,密码应该进行哈希处理,以增加安全性
  15.     users[username] = {'password': password, 'email': email}
  16.     return jsonify({'message': 'User registered successfully!'}), 201
复制代码
令牌革新

为了实现令牌革新机制,我们可以添加一个额外的路由来担适时牌并返回新的令牌。下面是一个简单的示例:
  1. # 令牌刷新路由
  2. @app.route('/refresh\_token', methods=['POST'])
  3. @token\_required
  4. def refresh\_token():
  5.     token = request.args.get('token')
  6.     try:
  7.         data = jwt.decode(token, app.config['SECRET\_KEY'], algorithms=['HS256'], options={'verify\_exp': False})
  8.         new_token = jwt.encode({'username': data['username']}, app.config['SECRET\_KEY'])
  9.         return jsonify({'token': new_token.decode('UTF-8')})
  10.     except:
  11.         return jsonify({'message': 'Token is invalid!'}), 403
复制代码
在这个示例中,我们使用了一个额外的路由/refresh_token来担当一个旧的JWT令牌,并使用相同的用户信息天生一个新的令牌。须要留意的是,我们关闭了过期验证选项,以便在旧令牌过期后天生新令牌。
通过实现这些功能,我们可以进一步加强我们的用户身份验证体系,并提供更好的用户体验和安全性。这些示例代码可以作为出发点,帮助您构建出更完备和功能强盛的应用程序。
日志和监控

在现实应用中,添加日志记录和监控功能对于跟踪和分析用户活动以及辨认潜在的安全问题至关紧张。下面是一个简单的示例,演示怎样使用Flask内置的日志记录功能来记录请求信息:
  1. import logging
  2. # 设置日志记录级别
  3. logging.basicConfig(level=logging.INFO)
  4. # 登录路由
  5. @app.route('/login')
  6. def login():
  7.     auth = request.authorization
  8.     logging.info(f"Login attempt with username: {auth.username}")
  9.     if auth and auth.username in users and users[auth.username] == auth.password:
  10.         token = jwt.encode({'username': auth.username}, app.config['SECRET\_KEY'])
  11.         logging.info(f"Login successful for username: {auth.username}")
  12.         return jsonify({'token': token.decode('UTF-8')})
  13.     logging.info(f"Login failed for username: {auth.username}")
  14.     return jsonify({'message': 'Authentication failed!'}), 401
复制代码
通过添加日志记录,我们可以在服务器端记录每次登录尝试的详细信息,以便后续分析和监控。
安全性加强

为了加强安全性,我们可以采取一些额外的步伐来保护用户身份验证过程中的敏感信息。下面是一些建议:


  • 使用HTTPS:通过使用HTTPS来加密通信,可以防止中间人攻击和窃听,从而保护用户的根据和数据。
  • 限制登录尝试次数:实行登录尝试次数限制和锁定账户机制,以防止暴力破解密码。
  • 密码哈希存储:对用户密码举行哈希处理,并采用适当的哈希算法和盐值来增加密码的安全性。
完备示例代码

下面是经过改进和扩展的完备示例代码,包括用户管理、令牌革新、日志记录和安全性加强:
  1. from flask import Flask, request, jsonifyimport jwtimport loggingfrom functools import wrapsapp = Flask(__name__)app.config['SECRET\_KEY'] = 'your\_secret\_key'# 模拟用户数据库users = {    'username': {'password': 'hashed\_password', 'email': 'user@example.com'}}# 设置日志记录级别logging.basicConfig(level=logging.INFO)# 身份验证装饰器def token\_required(f):    @wraps(f)    def decorated(\*args, \*\*kwargs):        token = request.args.get('token')        if not token:            return jsonify({'message': 'Token is missing!'}), 403        try:            data = jwt.decode(token, app.config['SECRET\_KEY'])        except:            return jsonify({'message': 'Token is invalid!'}), 403        return f(\*args, \*\*kwargs)    return decorated# 注册路由@app.route('/register', methods=['POST'])def register():    data = request.get_json()    username = data.get('username')    password = data.get('password')    email = data.get('email')    if username in users:        return jsonify({'message': 'Username already exists!'}), 400    # 在现实应用中,密码应该举行哈希处理,以增加安全性    users[username] = {'password': password, 'email': email}    return jsonify({'message': 'User registered successfully!'}), 201# 登录路由@app.route('/login')def login():    auth = request.authorization    logging.info(f"Login attempt with username: {auth.username}")    if auth and auth.username in users and users[auth.username]['password'] == auth.password:        token = jwt.encode({'username': auth.username}, app.config['SECRET\_KEY'])        logging.info(f"Login successful for username: {auth.username}")        return jsonify({'token': token.decode('UTF-8')})    logging.info(f"Login failed for username: {auth.username}")    return jsonify({'message': 'Authentication failed!'}), 401# 令牌刷新路由
  2. @app.route('/refresh\_token', methods=['POST'])
  3. @token\_required
  4. def refresh\_token():
  5.     token = request.args.get('token')
  6.     try:
  7.         data = jwt.decode(token, app.config['SECRET\_KEY'], algorithms=['HS256'], options={'verify\_exp': False})
  8.         new_token = jwt.encode({'username': data['username']}, app.config['SECRET\_KEY'])
  9.         return jsonify({'token': new_token.decode('UTF-8')})
  10.     except:
  11.         return jsonify({'message': 'Token is invalid!'}), 403
  12. # 受保护的路由@app.route('/protected')@token\_requireddef protected():    return jsonify({'message': 'Protected resource!'})if __name__ == '\_\_main\_\_':    app.run()
复制代码
通过结适用户管理、令牌革新、日志记录和安全性加强,我们可以构建一个更加美满和安全的用户身份验证体系。这个示例提供了一个出发点,您可以根据现实需求进一步定制和扩展。
HTTPS支持

在现实部署中,为了加强安全性,我们应该使用HTTPS来加密通信,防止中间人攻击和窃听。下面是怎样在Flask应用程序中启用HTTPS支持的示例代码:
  1. from flask import Flask, request, jsonify
  2. import jwt
  3. import logging
  4. from functools import wraps
  5. from OpenSSL import SSL
  6. app = Flask(__name__)
  7. app.config['SECRET\_KEY'] = 'your\_secret\_key'
  8. # 模拟用户数据库
  9. users = {
  10.     'username': {'password': 'hashed\_password', 'email': 'user@example.com'}
  11. }
  12. # 设置日志记录级别
  13. logging.basicConfig(level=logging.INFO)
  14. # 身份验证装饰器
  15. def token\_required(f):
  16.     @wraps(f)
  17.     def decorated(\*args, \*\*kwargs):
  18.         token = request.args.get('token')
  19.         if not token:
  20.             return jsonify({'message': 'Token is missing!'}), 403
  21.         try:
  22.             data = jwt.decode(token, app.config['SECRET\_KEY'])
  23.         except:
  24.             return jsonify({'message': 'Token is invalid!'}), 403
  25.         return f(\*args, \*\*kwargs)
  26.     return decorated
  27. # 注册路由、登录路由、令牌刷新路由和受保护的路由保持不变
  28. if __name__ == '\_\_main\_\_':
  29.     context = ('cert.pem', 'key.pem')  # 指定证书和密钥文件
  30.     app.run(host='0.0.0.0', port=443, ssl_context=context)
复制代码
在这个示例中,我们使用了OpenSSL库来天生证书和密钥文件。您须要提前准备好这两个文件,然后将其通报给ssl_context参数以启用HTTPS支持。这样一来,您的Flask应用程序将在443端口上运行,并使用HTTPS加密通信。
安全性评估

在部署和更新您的应用程序之前,确保举行安全性评估和检察,以辨认并修复潜在的安全问题。举行安全性测试、毛病扫描和代码检察是保护您的应用程序免受攻击的关键步骤。
JWT的优势

使用JWT举行身份验证具有很多优势:

  • 无状态性(Stateless):JWT令牌包含了所有须要的信息,因此服务器不须要在自己的存储中保存会话状态。这使得JWT非常得当于构建无状态的API,减轻了服务器的负担,并使得应用程序更易于扩展。
  • 跨域支持(Cross-Origin Support):由于JWT令牌可以在HTTP请求头或URL参数中传输,因此非常适适用于跨域请求。这使得在不同域之间举行身份验证变得更加简单。
  • 可扩展性(Scalability):JWT是基于JSON的标准,因此可以包含任意数量的声明。这使得JWT非常灵活,可以轻松地扩展以满意不同的需求。
  • 安全性(Security):JWT令牌可以使用密钥举行签名,以确保其完备性。这使得服务器能够验证令牌是否被篡改,从而确保用户身份的安全性。
进一步发展

固然上面的示例提供了一个根本的JWT身份验证实现,但在现实应用中大概须要进一步的发展和改进。一些大概的改进包括:


  • 用户管理:实现用户注册、管理和密码重置等功能,以及更复杂的用户权限管理。
  • 令牌革新:实现令牌革新机制,以允许用户在令牌过期前获取新的令牌。
  • 日志和监控:添加日志记录和监控功能,以便跟踪和分析用户活动和身份验证请求。
  • 安全性加强:思量使用HTTPS和其他安全步伐来保护身份验证流程中的敏感信息。
通过不断改进和美浑身份验证体系,可以提高应用程序的安全性和可用性,并为用户提供更好的体验。
总结

末了

自我介绍一下,小编13年上海交大结业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数网络安全工程师,想要提拔技能,往往是自己探索发展,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是盼望能够帮助到想自学提拔又不知道该从何学起的朋侪。





既有得当小白学习的零根本资料,也有得当3年以上履历的小同伴深入学习提拔的进阶课程,根本涵盖了95%以上网络安全知识点!真正的体系化!
假如你以为这些内容对你有帮助,须要这份全套学习资料的朋侪可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习条记、源码讲义、实战项目、解说视频,而且会持续更新!
图片转存中…(img-HGz26PaR-1715487646417)]
[外链图片转存中…(img-gGkOqB3w-1715487646417)]
既有得当小白学习的零根本资料,也有得当3年以上履历的小同伴深入学习提拔的进阶课程,根本涵盖了95%以上网络安全知识点!真正的体系化!
假如你以为这些内容对你有帮助,须要这份全套学习资料的朋侪可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习条记、源码讲义、实战项目、解说视频,而且会持续更新!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立山

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表