かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

Flask Flask-JWT-Extended がよしなに返してくれるエラーをカスタマイズしたい

Flask で書かれた API を使ったフロントの開発をしていました。
JWT が unauthorized になった時のエラーだけ他のエラーと形式が異なり、エラーコードも 401 で他のエラーと被ってしまっていて、フロントでエラーハンドリングが面倒なことになってしまっていたので、API 側に越境してエラー関連をカスタマイズしたメモ。

Python はなんもわからんマンが書いています。ご了承ください。

Flask-JWT-Extended がよしなにエラーを返すようになっていた。

API 側の実装を見にいくと、Flask-JWT-Extended というライブラリが使われており、API@jwt_required() デコレーターが有り、この中で JWT が unauthorized になるとライブラリがよしなにエラーを返却しているようでした。

from flask_jwt_extended import jwt_required

@app.route('/user', methods=['GET'])
@jwt_required()
def get_user():
  # 略 このブロック内に JWT unauthorized 時のエラーの実装はなし

@jwt デコレーターで JWT 関連のエラーハンドリングができる

# JWT が期限切れのとき
@jwt.expired_token_loader
def jwt_expired_token_callback(expired_token):
  token_type = expired_token['type']

  if token_type == 'access':
    return make_response(jsonify({
      'status': 'ACCESS_TOKEN_EXPIRED',
      'message': 'token expired',
    }), 401)
  else:
    return make_response(jsonify({
      'status': 'TOKEN_EXPIRED',
      'message': 'token expired',
    }), 401)

# JWT が invalid だったとき
@jwt.invalid_token_loader
def jwt_invalid_callback(error_string):
  return make_response(jsonify({
    'status': 'INVALID_TOKEN',
    'message': 'invalid token',
    'error': error_string
  }), 403)

# JWT の認証エラー
def jwt_unauthorized_callback(error_string):
  return make_response(jsonify({
    'status': 'UNAUTHORIZED',
    'message': 'invalid token',
    'error': error_string
  }), 403)

₍ ᐢ. ̫ .ᐢ ₎ できたっぽい!!

所感

フレームワークでよしなにしてくれるのは良いけど、ちゃんとフレームワークの使い方分かってないと細やかな部分で困りますね。
にしても Python 関連のドキュメント慣れてないからかも知れないけど見ずらいの多くない????


[参考]