改變回調(diào)函數(shù)
當試圖訪問受保護的端點時,我們提供我們認為是合理的行為。如果訪問令牌因任何原因無效(丟失、過期、篡改等),我們將返回{' msg ': ' why access endpoint failed '}格式的json和適當?shù)膆ttp狀態(tài)碼(通常為401或422)。但是,您可能希望在某些情況下定制返回的內(nèi)容。我們可以使用jwt_manager加載器函數(shù)來實現(xiàn)這一點。
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()
以下是可能的加載器函數(shù)。有關(guān)回調(diào)函數(shù)應(yīng)該使用什么參數(shù)以及回調(diào)函數(shù)的返回值需要什么參數(shù)的更多信息。
動態(tài)令牌過期時間
您還可以通過create_refresh_token()和create_access_token()函數(shù)中的expires_delta 參數(shù)更改令牌的過期時間。這需要一個datetime.timedelta。并覆蓋JWT_REFRESH_TOKEN_EXPIRES和JWT_ACCESS_TOKEN_EXPIRES設(shè)置。
如果您對不同的令牌有不同的用例,那么這是非常有用的。例如,您可能使用web應(yīng)用程序中使用的短生命期訪問令牌,但是您允許創(chuàng)建長生命期訪問令牌,其他開發(fā)人員可以生成這些令牌,并使用它們在程序中與您的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