一,基本认证(Basic Authentication):
这是一种简单的鉴权方式,需要客户端发送用户名和密码,服务器验证后允许或拒绝访问。可以使用 Flask-BasicAuth 扩展来实现。
# 安装扩展
pip install Flask-BasicAuth
from flask import Flask
from flask_basicauth import BasicAuth
app = Flask(__name__)
app.config['BASIC_AUTH_USERNAME'] = 'admin'
app.config['BASIC_AUTH_PASSWORD'] = '123456'
app.config['BASIC_AUTH_FORCE'] = False # 为True 就默认对所有 api 进行认证, 如果设置为 False, 那么可以通过 @basic_auth.required 对指定 api 进行认证。
basic_auth = BasicAuth(app)
@app.route('/')
@basic_auth.required
def hello_world():
return 'Hello World!'
此时访问需要鉴权的路由,提示需要登录,输入预设的账密即可完成登录
二,Token 鉴权
客户端在请求中携带一个令牌(token),服务器验证该令牌是否有效。这种方式通常用于API鉴权。可以使用 Flask-JWT-Extended 或 Flask-RESTful 等扩展来实现。
# 安装扩展
pip install Flask-JWT-Extended
from flask import Flask, request
from flask_jwt_extended import JWTManager, create_access_token, jwt_required, get_jwt_identity
app = Flask(__name__)
# 设置密钥,用于加密 Token
app.config['JWT_SECRET_KEY'] = 'your_secret_key'
# 初始化 JWTManager
jwt = JWTManager(app)
# 路由用于用户登录并生成 Token
@app.route('/login', methods=['POST'])
def login():
username = request.json.get('username')
password = request.json.get('password')
# 这里应该根据用户名和密码验证用户
# 如果验证成功,创建并返回一个 Token
if username == 'user' and password == 'password':
access_token = create_access_token(identity=username)
return {'access_token': access_token}
else:
return {'message': 'Invalid credentials'}, 401
# 受保护的路由,需要 Token 鉴权
@app.route('/protected', methods=['GET'])
@jwt_required()
def protected_route():
current_user = get_jwt_identity()
return f'Hello, {current_user}! This route is protected by JWT.'
if __name__ == '__main__':
app.run()
❣️在 /login 路由中,用户提供用户名和密码进行验证。如果验证成功,将创建并返回一个包含用户身份信息的 Token。
在 /protected 路由中,我们使用了 @jwt_required() 装饰器,它要求请求中必须包含有效的 Token 才能访问。
你需要将上述示例中的用户名和密码验证部分替换为你实际的用户验证逻辑。请确保在生产环境中使用 HTTPS 来保护通信安全,并考虑其他安全性措施,如 Token 过期时间、刷新 Token 等。
三,自定义装饰器
你可以编写自己的装饰器函数来实现鉴权逻辑。
from flask import Flask, request, jsonify
from functools import wraps
app = Flask(__name__)
# 用户认证函数,根据用户名和密码验证用户
def authenticate(username, password):
# 实际应用中,这里应该根据用户名和密码进行验证
if username == 'user' and password == 'password':
return True
return False
# 自定义装饰器函数,用于鉴权
def auth_required(f):
@wraps(f)
def decorated_function(*args, **kwargs):
auth = request.authorization
if not auth or not authenticate(auth.username, auth.password):
return jsonify({'message': 'Authentication required'}), 401
return f(*args, **kwargs)
return decorated_function
@app.route('/')
@auth_required
def protected_route():
return 'This route is protected by custom authentication.'
if __name__ == '__main__':
app.run()