网站首页 > 技术文章 正文
Flask-JWT(JSON Web Tokens for Flask)是一个用于 Flask 应用程序的扩展,它允许你实现基于 JSON Web Tokens (JWT) 的无状态身份验证机制。JWT 是一种开放标准,用于在各方之间安全地传输信息作为 JSON 对象。
安装
通过 pip 安装 Flask-JWT:
pip install flask-jwt
配置
在 Flask 应用中配置 JWT 所需的参数,通常在配置文件中设置:
# config.py
JWT_SECRET_KEY = 'your-secret-key'
JWT_TOKEN_LOCATION = ['headers']
JWT_HEADER_NAME = 'Authorization'
JWT_ACCESS_TOKEN_EXPIRES = timedelta(minutes=60)
JWT_REFRESH_TOKEN_EXPIRES = timedelta(days=30)
初始化
在 Flask 应用中初始化 Flask-JWT 扩展:
from flask import Flask
from flask_jwt import JWT
app = Flask(__name__)
app.config.from_object('config.Config')
jwt = JWT(app)
创建和验证令牌
创建 JWT 令牌通常涉及到用户登录的流程。一旦用户成功登录,服务器将生成一个 JWT 令牌并发送给客户端。
from werkzeug.security import safe_str_cmp
@app.route('/login', methods=['POST'])
def login():
username = request.json.get('username', None)
password = request.json.get('password', None)
if username and password and safe_str_cmp(username, 'admin') and safe_str_cmp(password, 'password'):
token = jwt.encode({'username': username}, app.config['JWT_SECRET_KEY'])
return {'token': token}
else:
return {'error': 'Invalid credentials'}, 400
客户端在随后的每个请求中都需要携带这个令牌,通常是在 HTTP 请求的头部(Authorization header)。服务器接收到请求后,会验证令牌的有效性。
@app.before_request
def parse_jwt():
token = request.headers.get('Authorization', None)
if not token:
return jwt_required()
try:
# 验证令牌并获取用户信息
payload = jwt.decode(token, app.config['JWT_SECRET_KEY'])
except:
# 令牌无效或已过期
return jwt_required()
# 将用户信息存储在 g 对象中,供后续请求使用
g.current_user = payload.get('username')
刷新令牌
Flask-JWT 允许使用刷新令牌来延长访问令牌的有效期。刷新令牌的有效期通常比访问令牌长很多。
from flask_jwt import refresh_token_required
@app.route('/refresh', methods=['POST'])
@refresh_token_required()
def refresh():
new_token = jwt.refresh_token_loader(request.json.get('refresh_token'))
return {'token': new_token}
保护路由
可以使用 @jwt_required() 装饰器来保护特定的路由,确保只有持有有效 JWT 的用户才能访问。
from flask_jwt import jwt_required
@app.route('/protected')
@jwt_required()
def protected():
return {'data': 'This is a protected resource only accessible with a valid JWT'}
Flask-JWT 是实现基于令牌的身份验证的便捷方式,它支持无状态认证,有助于构建可扩展且安全的 Flask 应用程序。通过使用 JWT,可以减少对数据库的频繁查询,提高应用性能。
猜你喜欢
- 2024-10-15 Python Flask Web表单(flask form表单)
- 2024-10-15 如何在Flask应用程序中使用JSON Web Tokens进行安全认证
- 2024-10-15 综合指南:将 Flask 与 MongoDB 结合使用
- 2024-10-15 python-flask搭建平台,HTML+CSS+JS写前端的web全栈-动画轮播
- 2024-10-15 Flask 表单处理(flask formdata)
- 2024-10-15 三、flask博客项目实战-之表单(flask 表单)
- 2024-10-15 flask python web开发的简单易学框架
- 2024-10-15 Flask-APScheduler使用教程(flask apscheduler)
- 2024-10-15 flask 项目中使用 bootstrapFileInput(进阶篇)
- 2024-10-15 基于flask框架展示数据可视化的一次尝试
- 最近发表
-
- 如何在 Linux 上安装 Java_怎么在linux中安装jdk
- Linux中tar命令打包路径相关问题_linux怎么用tar打包一个目录
- 常用linux系统常用扫描命令汇总_常用linux系统常用扫描命令汇总表
- VM下linux虚拟机新建过程(有图)_linux虚拟机创建新用户命令
- 系统小技巧:迁移通过Wubi方式安装的Ubuntu系统
- 文件系统(八):Linux JFFS2文件系统工作原理、优势与局限
- 如何利用ftrace精确跟踪特定进程调度信息
- prometheus网络监控之fping-exporter
- hyper linux的实操步骤,hyper-v批量管理工具的使用指南
- 2021年,运维工程师笔试真题(二)(附带答案)
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)