👻
FastAPIでJWTトークンを取得するためのリクエストに失敗したとき
はじめに
FastAPIでJWTトークンを取得するためのエンドポイントを実装しました[1]。
ところがREST Client[2]を使って実装したエンドポイントを叩こうとしたところ、422 Unprocessable Entity
が出てしまい少しだけハマったので、ここに解決方法を残しておきます。
結論
以下のようにhttpファイルを作成し[3]、リクエストを飛ばせばOKです。
token_success.http
POST http://127.0.0.1:8000/token/
content-type: application/x-www-form-urlencoded
username=johndoe
&password=secret
原因
上手くいかなかった原因は下記の2つでした。
- エンドポイントで
content-type: application/x-www-form-urlencoded
を受け付けているのに、content-type: application/json
でリクエストしていた。 - ボディの書き方を間違えていた。
content-typeの間違いにはすぐ気付いたものの、ボディの書き方を間違えたままだったので少しハマってしまいました。ちなみに元々このように書いていました。
token_error.http
POST http://127.0.0.1:8000/token/
# content-typeは修正した
content-type: application/x-www-form-urlencoded
# ボディの書き方を間違えたままだった
{
"username": "johndoe",
"password: "secret"
}
おわりに
ずっとボディのスペルやクォーテーションと睨めっこしていました。
おまけ
この後普通にGETしたら401 Unauthorized
と怒られたのでおまけ。
取得したトークンはヘッダーに入れましょう(当たり前)。
items.http
GET http://127.0.0.1:8000/items/
Authorization: Bearer ThisIsJwtToken
Discussion