Flask中的JWT认证构建安全的用户身份验证系统

        data = jwt.decode(token, app.config['SECRET\_KEY'])
    except:
        return jsonify({'message': 'Token is invalid!'}), 403

    return f(\*args, \*\*kwargs)

return decorated

登录路由

@app.route(‘/login’)
def login():
auth = request.authorization

if auth and auth.username in users and users[auth.username] == auth.password:
    token = jwt.encode({'username': auth.username}, app.config['SECRET\_KEY'])
    return jsonify({'token': token.decode('UTF-8')})

return jsonify({'message': 'Authentication failed!'}), 401

受保护的路由

@app.route(‘/protected’)
@token_required
def protected():
return jsonify({‘message’: ‘Protected resource!’})

if name == ‘__main__’:
app.run()


在上面的示例中,我们首先导入所需的库,并设置了用于签名JWT的密钥。然后,我们模拟了一个简单的用户数据库,并创建了一个装饰器`token_required`,用于验证JWT令牌。接着,我们定义了两个路由:`/login`用于登录并生成JWT令牌,`/protected`是一个受保护的资源,需要提供有效的JWT令牌才能访问。


#### 进一步示例代码


##### 用户管理


在用户管理方面,我们可以扩展我们的示例代码以支持用户注册、管理和密码重置。下面是一个简单的示例:



用户数据库

users = {
‘username’: {‘password’: ‘hashed_password’, ‘email’: ‘user@example.com’}
}

注册路由

@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(‘/refresh_token’, methods=[‘POST’])
@token_required
def refresh_token():
token = request.args.get(‘token’)

try:
    data = jwt.decode(token, app.config['SECRET\_KEY'], algorithms=['HS256'], options={'verify\_exp': False})
    new_token = jwt.encode({'username': data['username']}, app.config['SECRET\_KEY'])
    return jsonify({'token': new_token.decode('UTF-8')})
except:
    return jsonify({'message': 'Token is invalid!'}), 403

在这个示例中,我们使用了一个额外的路由`/refresh_token`来接受一个旧的JWT令牌,并使用相同的用户信息生成一个新的令牌。需要注意的是,我们关闭了过期验证选项,以便在旧令牌过期后生成新令牌。


通过实现这些功能,我们可以进一步增强我们的用户身份验证系统,并提供更好的用户体验和安全性。这些示例代码可以作为起点,帮助您构建出更完整和功能强大的应用程序。


#### 日志和监控


在实际应用中,添加日志记录和监控功能对于跟踪和分析用户活动以及识别潜在的安全问题至关重要。下面是一个简单的示例,演示如何使用Flask内置的日志记录功能来记录请求信息:



import logging

设置日志记录级别

logging.basicConfig(level=logging.INFO)

登录路由

@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] == 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

通过添加日志记录,我们可以在服务器端记录每次登录尝试的详细信息,以便后续分析和监控。


#### 安全性增强


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


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


#### 完整示例代码


下面是经过改进和扩展的完整示例代码,包括用户管理、令牌刷新、日志记录和安全性增强:



from flask import Flask, request, jsonify
import jwt
import logging
from functools import wraps

app = 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

令牌刷新路由

@app.route(‘/refresh_token’, methods=[‘POST’])
@token_required
def refresh_token():
token = request.args.get(‘token’)

try:
    data = jwt.decode(token, app.config['SECRET\_KEY'], algorithms=['HS256'], options={'verify\_exp': False})
    new_token = jwt.encode({'username': data['username']}, app.config['SECRET\_KEY'])
    return jsonify({'token': new_token.decode('UTF-8')})
except:
    return jsonify({'message': 'Token is invalid!'}), 403

受保护的路由

@app.route(‘/protected’)
@token_required
def protected():
return jsonify({‘message’: ‘Protected resource!’})

if name == ‘__main__’:
app.run()


通过结合用户管理、令牌刷新、日志记录和安全性增强,我们可以构建一个更加完善和安全的用户身份验证系统。这个示例提供了一个起点,您可以根据实际需求进一步定制和扩展。


#### HTTPS支持


在实际部署中,为了增强安全性,我们应该使用HTTPS来加密通信,防止中间人攻击和窃听。下面是如何在Flask应用程序中启用HTTPS支持的示例代码:



from flask import Flask, request, jsonify
import jwt
import logging
from functools import wraps
from OpenSSL import SSL

app = 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

注册路由、登录路由、令牌刷新路由和受保护的路由保持不变

if name == ‘__main__’:
context = (‘cert.pem’, ‘key.pem’) # 指定证书和密钥文件
app.run(host=‘0.0.0.0’, port=443, ssl_context=context)


在这个示例中,我们使用了OpenSSL库来生成证书和密钥文件。您需要提前准备好这两个文件,然后将其传递给`ssl_context`参数以启用HTTPS支持。这样一来,您的Flask应用程序将在443端口上运行,并使用HTTPS加密通信。


#### 安全性评估

## 最后

**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**

![img](https://img-blog.csdnimg.cn/img_convert/bf26b4ddd23ce5165a24966bd208e028.png)

![img](https://img-blog.csdnimg.cn/img_convert/da534ea665e8c43a1a43c07c8676f48e.png)

![img](https://img-blog.csdnimg.cn/img_convert/d9e9be329f94eb857949cd5d30f96a16.png)

![img](https://img-blog.csdnimg.cn/img_convert/adcf8f33e51c3f7145f9f0ae3eeb95b5.png)

![img](https://img-blog.csdnimg.cn/img_convert/3ec8643a195178856c111b8bf0d4e253.png)

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618653875)

**由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**

图片转存中...(img-iFoAtE9t-1715487743287)]

[外链图片转存中...(img-OAOS5EKi-1715487743287)]

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618653875)

**由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**

  • 23
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值