安装
通过 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,可以减少对数据库的频繁查询,提高运用性能。