👻

FastAPIでJWTトークンを取得するためのリクエストに失敗したとき

2023/01/01に公開

はじめに

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
脚注
  1. パスワード(およびハッシュ化)によるOAuth2、JWTトークンによるBearer - FastAPI ↩︎

  2. REST Client - Visual Studio Marketplace ↩︎

  3. [VSCode][Rest Client]フォーム形式のPOSTリクエストを送信する - Qiita ↩︎

GitHubで編集を提案

Discussion