使用JSON Web Tokens(JWT)并设置过期时间来避免令牌生成。以下是使用Python Flask框架实现JWT的示例代码:
import jwt
from datetime import datetime, timedelta
from flask import Flask, request, jsonify
app = Flask(__name__)
# 定义秘钥
app.config['SECRET_KEY'] = 'your-secret-key'
# 定义登录路由
@app.route('/login', methods=['POST'])
def login():
# 获取用户信息
username = request.json.get('username')
password = request.json.get('password')
# 根据用户信息认证身份
# ...
# 认证成功后生成令牌并设置有效期为30分钟
payload = {'username': username, 'exp': datetime.utcnow() + timedelta(minutes=30)}
token = jwt.encode(payload, app.config['SECRET_KEY'], algorithm='HS256')
# 返回令牌
return jsonify({'token': token.decode('utf-8')}), 200
# 定义需要认证的路由
@app.route('/protected', methods=['GET'])
def protected():
# 获取请求头中的JWT
token = request.headers.get('Authorization').split()[1]
try:
# 解码JWT并验证令牌是否有效
payload = jwt.decode(token, app.config['SECRET_KEY'], algorithms=['HS256'])
username = payload['username']
# 根据令牌中的信息完成需要认证的操作
# ...
# 返回需要认证的操作结果
return jsonify({'message': 'Hello, {}! This is a protected message.'.format(username)}), 200
except jwt.ExpiredSignatureError:
# 如果令牌过期,则返回401未认证响应
return jsonify({'message': 'Token expired.'}), 401
except jwt.InvalidTokenError:
# 如果令牌无效,则返回401未认证响应
return jsonify({'message': 'Invalid token.'}), 401
在以上示例代码中,使用JWT生成令牌,并设置有效期为30分钟。在需要认证的路由中,先从请求头中获取JWT并解码,然后验证令牌是否有效。如果令牌过期或无效,则返回401未认证响应。如果令牌有效,则根据令牌中的信息完成需要认证的操作。