使用flask开发后端时,想使用jwt保护所有视图函数,前端用户的每一项操作。都有对应的令牌。令牌时间设置30s,当用户退出登录或关闭浏览器时清空后端,如何实现?
时间: 2024-09-20 11:05:05 浏览: 61
在Flask应用中使用JWT(JSON Web Tokens)保护所有视图需要以下几个步骤:
1. **安装依赖**:
首先,你需要安装`PyJWT`库,它用于生成和验证JWT。你可以通过pip安装:
```
pip install pyjwt flask-jwt_extended
```
2. **配置JWT**:
在Flask应用初始化时,配置`flask_jwt_extended`。设置SECRET_KEY作为JWT的签名密钥,并启用token过期机制,比如30秒:
```python
from flask_jwt_extended import JWTManager
app = Flask(__name__)
jwt = JWTManager(app)
app.config['JWT_SECRET_KEY'] = 'your_secret_key' # 替换为你的密钥
app.config['JWT_ACCESS_TOKEN_EXPIRES'] = timedelta(seconds=30) # 30秒过期时间
```
3. **身份验证中间件**:
在每个需要鉴权的视图前添加JWT身份验证中间件。例如:
```python
@app.route('/protected', methods=['GET'])
@jwt_required() # 这会检查是否有有效的JWT token
def protected_view():
# ...
```
4. **登出处理**:
用户登出时,可以注销他们的JWT并将其从服务器端清除。这通常涉及到从数据库或缓存中删除相关的令牌信息:
```python
def logout_user(response):
jti = get_jwt_identity() # 获取当前JWT的jti(JWT ID)
# 删除该用户的令牌信息
remove_token_from_db(jti) # 根据你的存储方式删除
return response
@app.route('/logout')
def logout():
resp = make_response(logout_user('', 200)) # 返回一个空响应并强制刷新浏览器
resp.delete_cookie('access_token') # 清除cookie中的JWT
return resp
```
5. **清除过期的令牌**:
可以定期清理过期的令牌,但这是一个额外的优化步骤,而不是必需的。如果你选择这样做,可以在Flask-JWT-Extended的回调中实现:
```python
@jwt.token_in_blacklist_loader
def check_if_revoked(decrypted_token):
# 检查是否已被撤销(例如,在Token Revocation List)
# 如果被撤销,返回True
return decrypted_token['revoked']
@jwt.revoked_token_loader
def revoked_token_callback():
return jsonify({"message": "The token has been revoked."}), 401
```
每次用户请求资源时,都会检查他们是否有有效的JWT。当令牌过期或者用户主动登出时,服务器将不再接受请求。
阅读全文