0
0

【備忘録】flask_jwt_extended 認証エラー時の 500 Internal Server Error を解消

Posted at

はじめに

FLASK アプリケーションにJWTでの認証を追加した。正常ルートは難なく通ったが、認証エラーで 500 Internal Server Error が返ってしまう。ハンドリングもしているのに・・・
単純なことで認証エラーが返るようになったので、対応方法を残しておく。

対応方法

変更前

ソースコードは相当端折ってます。ポイントだけ。。。
app.py

:
snip
:
app = Flask(__name__)

app.config['JWT_SECRET_KEY'] = 'jwtsecretkey'
api = Api(app)
api.add_resource(Login,   '/login')
api.add_resource(HogeAPI, '/hogehoge')

jwt = JWTManager(app)

api.py

class Login(Resource):
  def post(self):
    username = request.json.get('username', None)
    access_token = create_access_token(identity=username)
    return {"access_token":access_token}, 200

class HogeAPI(Resource):
  @jwt_required()
  def get(self):
    return {"MSG":"OK!"}, 200
:

GETすると・・・

$ curl http://localhost:5000/hogehoge  -H "Authorization: Bearer ${TOKEN}"
{"MSG": "OK!"}
$ curl http://localhost:5000/hogehoge  -H "Authorization: Bearer ${TOKEN}x"
{"message": "Internal Server Error"}
$ curl http://localhost:5000/hogehoge
{"message": "Internal Server Error"}
$

jwt_required()デコレータが効いてない!
色々と調べたりハンドリング処理を追加したり実験してみたけど、Apiのパラメータを追加しただけで認証エラーが返るようになりました。

変更後

ソースコードは相当端折ってます。ポイントだけ。。。
app.py

:
snip
:
app = Flask(__name__)

app.config['JWT_SECRET_KEY'] = 'jwtsecretkey'
api = Api(app, errors=Flask.errorhandler)             ★変更箇所(ここだけ)
api.add_resource(Login,   '/login')
api.add_resource(HogeAPI, '/hogehoge')

jwt = JWTManager(app)

api.py

class Login(Resource):
  def post(self):
    username = request.json.get('username', None)
    access_token = create_access_token(identity=username)
    return {"access_token":access_token}, 200

class HogeAPI(Resource):
  @jwt_required()
  def get(self):
    return {"MSG":"OK!"}, 200
:

GETすると・・・

$ curl http://localhost:5000/hogehoge  -H "Authorization: Bearer ${TOKEN}"
{"MSG": "OK!"}
$ curl http://localhost:5000/hogehoge  -H "Authorization: Bearer ${TOKEN}x"
{"msg":"Signature verification failed"}
$ curl http://localhost:5000/hogehoge
{"msg":"Missing Authorization Header"}
$

やっと目的達成!因みにステータスコードは下記の通りです。
{"msg":"Signature verification failed"} ⇒ 422 UNPROCESSABLE ENTITY
{"msg":"Missing Authorization Header"} ⇒ 401 UNAUTHORIZED

最後に

上記のソースコードからはわかりませんが、
FLASK-RESTful, FLASK-SQLAlchemy, ... FLASKの拡張ライブラリ等を色々いれてますので、その影響もあるかと思います。時間はかかったけどうまくいって良かった。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0