使用flask开发后端时,想使用jwt保护所有视图函数,前端用户的每一项操作。都有对应的令牌。令牌时间设置30s,当用户退出登录或关闭浏览器时清空后端,如何实现?另外已经写好的前端关于jwt这部分如何添加
时间: 2024-09-19 19:12:17 浏览: 46
在Flask应用中,为了使用JWT(JSON Web Tokens)保护所有视图函数并限制其有效期为30秒,你可以按照以下步骤操作:
1. 安装依赖库:
首先,你需要安装`Flask-Extended`库,可以使用pip进行安装:
```
pip install flask-jwt-extended
```
2. 初始化JWT扩展:
在Flask应用初始化文件(如app.py)中,配置JWT:
```python
from flask_jwt_extended import JWTManager, create_access_token
app = Flask(__name__)
app.config['JWT_SECRET_KEY'] = 'your_secret_key' # 设置JWT密钥
jwt = JWTManager(app)
```
3. 注册蓝图并保护视图:
对于每个需要保护的视图函数,你可以使用装饰器`@jwt_required()`,例如:
```python
@app.route('/protected', methods=['GET'])
@jwt_required()
def protected_view():
# 视图业务逻辑...
return {'message': 'You are authenticated'}
```
这将检查请求头中的JWT是否有效。
4. 创建和刷新令牌:
在用户登录时,生成并返回带有过期时间的访问令牌:
```python
@app.route('/login', methods=['POST'])
def login():
username = request.form.get('username')
password = request.form.get('password')
if verify_credentials(username, password): # 自定义验证逻辑
access_token = create_access_token(identity=username, expires_delta=datetime.timedelta(seconds=30))
return jsonify(access_token=access_token)
return jsonify(error='Invalid credentials'), 401
```
5. 清除token(注销):
可以创建一个路由来处理登出逻辑,在这里清除用户session和数据库中的token记录,通常在接收到特定信号(如用户点击“登出”按钮或浏览器关闭)时执行:
```python
@app.route('/logout', methods=['POST'])
def logout():
# 清理session和数据库中的token
# ...
resp = jsonify(logged_out=True)
resp.delete_cookie('access_token') # 如果有设置cookie的话
return resp, 200
```
6. 前端实现:
在前端,每次发送请求前,从cookie或localStorage中取出JWT并在headers中添加`Authorization: Bearer <your_token>`。当用户登出时,删除存储的token,并在下次请求时不再包含它。
现在前端部分需要修改的地方包括:
- 添加一个保存JWT到本地存储的功能,比如在`axios.interceptors.request.use`钩子里加上处理JWT的逻辑。
- 在注销操作后,清理本地存储的JWT和清除浏览器的cookie。
阅读全文