身份识别
要实现身份识别功能,我们需要提供一个identity函数来获取用户对象。在本文中,我们将使用用户ID来获取用户对象。在auth.py模块中,我们可以定义一个名为identity的函数:
代码语言:javascript复制from models import User
def identity(payload):
user_id = payload['identity']
return User.query.get(user_id)
在这个例子中,我们首先从JWT载荷中获取用户ID,然后使用用户ID从数据库中获取用户对象。
保护API
现在,我们已经实现了基本的身份验证和身份识别功能,下一步是保护我们的API。在本文中,我们将使用Flask-JWT提供的jwt_required装饰器来保护API。在api.py模块中,我们可以定义一个需要身份验证才能访问的API:
代码语言:javascript复制from flask import jsonify
from flask_jwt import jwt_required, current_identity
@app.route('/api/me')
@jwt_required()
def me():
return jsonify({'user_id': current_identity.id, 'username': current_identity.username})
在这个例子中,我们使用jwt_required装饰器将me()视图函数标记为需要身份验证才能访问的API。如果用户没有提供有效的JWT令牌,Flask-JWT将返回一个HTTP 401 Unauthorized错误。如果用户提供了有效的JWT令牌,当前用户的身份将通过current_identity全局变量进行访问。
JWT选项
Flask-JWT扩展还提供了一些选项,用于控制JWT的生成和解码行为。以下是一些常见选项:
- JWT_EXPIRATION_DELTA: JWT的过期时间。默认为一小时。
- JWT_AUTH_HEADER_PREFIX: JWT令牌的前缀。默认为'JWT'。
- JWT_ALGORITHM: JWT的加密算法。默认为HS256。
- JWT_SECRET_KEY: JWT的密钥。默认为Flask应用程序的SECRET_KEY选项。
要设置这些选项,您可以在Flask应用程序实例上设置相应的配置选项:
代码语言:javascript复制app.config['JWT_EXPIRATION_DELTA'] = timedelta(seconds=300)
app.config['JWT_AUTH_HEADER_PREFIX'] = 'Bearer'
app.config['JWT_ALGORITHM'] = 'HS512'