第10章 改變默認行為

改變回調(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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容