第10章 改变默认行为

改变回调函数

当试图访问受保护的端点时,我们提供我们认为是合理的行为。如果访问令牌因任何原因无效(丢失、过期、篡改等),我们将返回{' msg ': ' why access endpoint failed '}格式的json和适当的http状态码(通常为401或422)。但是,您可能希望在某些情况下定制返回的内容。我们可以使用jwt_manager加载器函数来实现这一点。

from flask import Flask, jsonify, request
from flask_jwt_extended import (
    JWTManager, jwt_required, create_access_token
)

app = Flask(__name__)

app.config['JWT_SECRET_KEY'] = 'super-secret'  # Change this!
jwt = JWTManager(app)


# Using the expired_token_loader decorator, we will now call
# this function whenever an expired but otherwise valid access
# token attempts to access an endpoint
@jwt.expired_token_loader
def my_expired_token_callback(expired_token):
    token_type = expired_token['type']
    return jsonify({
        'status': 401,
        'sub_status': 42,
        'msg': 'The {} token has expired'.format(token_type)
    }), 401


@app.route('/login', methods=['POST'])
def login():
    username = request.json.get('username', None)
    password = request.json.get('password', None)
    if username != 'test' or password != 'test':
        return jsonify({"msg": "Bad username or password"}), 401

    ret = {'access_token': create_access_token(username)}
    return jsonify(ret), 200


@app.route('/protected', methods=['GET'])
@jwt_required
def protected():
    return jsonify({'hello': 'world'}), 200


if __name__ == '__main__':
    app.run()

以下是可能的加载器函数。有关回调函数应该使用什么参数以及回调函数的返回值需要什么参数的更多信息。

动态令牌过期时间

您还可以通过create_refresh_token()和create_access_token()函数中的expires_delta 参数更改令牌的过期时间。这需要一个datetime.timedelta。并覆盖JWT_REFRESH_TOKEN_EXPIRES和JWT_ACCESS_TOKEN_EXPIRES设置。
如果您对不同的令牌有不同的用例,那么这是非常有用的。例如,您可能使用web应用程序中使用的短生命期访问令牌,但是您允许创建长生命期访问令牌,其他开发人员可以生成这些令牌,并使用它们在程序中与您的api进行交互。

@app.route('/create-dev-token', methods=['POST'])
@jwt_required
def create_dev_token():
    username = get_jwt_identity()
    expires = datetime.timedelta(days=365)
    token = create_access_token(username, expires_delta=expires)
    return jsonify({'token': token}), 201
You can even disable expiration by setting expires_delta to False:

@app.route('/create-api-token', methods=['POST'])
@jwt_required
def create_api_token():
    username = get_jwt_identity()
    token = create_access_token(username, expires_delta=False)
    return jsonify({'token': token}), 201

你可能感兴趣的:(第10章 改变默认行为)