在每个请求上验证 JWT 令牌是一种常见的做法,但它可能会导致性能问题。为了避免在每个请求上验证 JWT 令牌,可以使用以下解决方法:
from flask import Flask, request, session
from jwt import decode, InvalidTokenError
app = Flask(__name__)
app.secret_key = 'your_secret_key'
@app.before_request
def check_jwt_token():
if 'jwt_token' not in session:
# 用户未登录,返回错误信息或重定向到登录页
return 'User not logged in'
try:
decoded_token = decode(session['jwt_token'], 'your_secret_key')
# 验证成功,可以在请求处理函数中使用 decoded_token['user_id'] 等信息
except InvalidTokenError:
# 令牌无效,返回错误信息或重定向到登录页
return 'Invalid token'
@app.route('/login', methods=['POST'])
def login():
# 在用户登录成功后,将 JWT 令牌存储在会话中
session['jwt_token'] = 'your_jwt_token'
return 'Login successful'
@app.route('/protected')
def protected():
# 会话中存在有效的 JWT 令牌,无需每次解码和验证
return 'Protected resource'
from flask import Flask, request
from jwt import decode, InvalidTokenError
app = Flask(__name__)
def jwt_token_required():
def decorator(f):
def wrapper(*args, **kwargs):
try:
jwt_token = request.headers.get('Authorization').split(' ')[1]
decoded_token = decode(jwt_token, 'your_secret_key')
# 验证成功,可以在请求处理函数中使用 decoded_token['user_id'] 等信息
return f(*args, **kwargs)
except (InvalidTokenError, IndexError):
# 令牌无效,返回错误信息或重定向到登录页
return 'Invalid token'
return wrapper
return decorator
@app.route('/protected')
@jwt_token_required()
def protected():
# 在请求处理函数中使用解码后的 JWT 令牌信息
return 'Protected resource'
以上代码示例基于 Flask 框架,使用了 Python JWT 库来解码和验证 JWT 令牌。根据具体的框架和库,代码可能会有所不同,但基本思路是相似的。