はじめに
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の拡張ライブラリ等を色々いれてますので、その影響もあるかと思います。時間はかかったけどうまくいって良かった。