保护 REST API 的解决方法有很多种,以下是一些常见的方法和代码示例:
使用身份验证和授权机制:
from flask import Flask, request
from functools import wraps
from flask_httpauth import HTTPBasicAuth
app = Flask(__name__)
auth = HTTPBasicAuth()
@auth.verify_password
def verify_password(username, password):
# 根据用户名和密码验证用户的逻辑
if username == 'admin' and password == 'password':
return True
return False
@app.route('/api/protected')
@auth.login_required
def protected_resource():
# 受保护的 API 端点
return 'Protected Resource'
if __name__ == '__main__':
app.run()
from flask import Flask, request
from functools import wraps
from flask_httpauth import HTTPTokenAuth
app = Flask(__name__)
auth = HTTPTokenAuth(scheme='Bearer')
@auth.verify_token
def verify_token(token):
# 根据令牌验证用户的逻辑
if token == 'valid_token':
return True
return False
@app.route('/api/protected')
@auth.login_required
def protected_resource():
# 受保护的 API 端点
return 'Protected Resource'
if __name__ == '__main__':
app.run()
使用访问控制列表(Access Control List):
from flask import Flask, request
from functools import wraps
app = Flask(__name__)
def check_permission(username):
# 根据用户名检查用户的权限逻辑
if username == 'admin':
return True
return False
def requires_permission(func):
@wraps(func)
def decorated(*args, **kwargs):
username = request.headers.get('username')
if check_permission(username):
return func(*args, **kwargs)
else:
return 'Permission Denied', 403
return decorated
@app.route('/api/protected')
@requires_permission
def protected_resource():
# 受保护的 API 端点
return 'Protected Resource'
if __name__ == '__main__':
app.run()
使用限流机制(Rate Limiting):
from flask import Flask, request
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
app = Flask(__name__)
limiter = Limiter(app, key_func=get_remote_address)
@app.route('/api/protected')
@limiter.limit('10/minute') # 每分钟最多请求 10 次
def protected_resource():
# 受保护的 API 端点
return 'Protected Resource'
if __name__ == '__main__':
app.run()
使用加密机制(Encryption):
from flask import Flask
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer, BadSignature, SignatureExpired
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
def generate_token():
s = Serializer(app.config['SECRET_KEY'], expires_in=3600) # 有效期为 1 小时
token = s.dumps({'username': 'admin'}).decode('utf-8')
return token
def verify_token(token):
s = Serializer(app.config['SECRET_KEY'])
try:
data = s.loads(token)
# 根据数据验证令牌的逻辑
if data['username'] == 'admin':
return True
return False
except (BadSignature, SignatureExpired):
return False
@app.route('/api/token')
def get_token():
token = generate_token()
return token
@app.route('/api/protected/')
def protected_resource(token):
if verify_token(token):
# 受保护的 API 端点
return 'Protected Resource'
else:
return 'Invalid Token', 401
if __name__ == '__main__':
app.run()
这些方法可以根据实际需求进行组合使用,以提