🐥

Laravel Sanctum でハマったところ

2021/12/10に公開

jwt-authを利用していたが、最近は更新されず、webでJWT認証は危ないと言われているので、Laravel Sanctumに移行しようと思い触ってみたところ、小さなミスでかなり時間を取られたので記録しておく。

Laravel Sanctumの基本的な使い方は日本語記事でもたくさん転がってるので、それを参考にPostmanで認証するところまでは簡単にできた。問題は実際にwebアプリからaxiosでログインしようとしたときに419が返ってきてハマった。

問題のコード:

const login = async ({ email, password }) => {
  await axios.get('http://localhost:8088/sanctum/csrf-cookie', { withCredentials: true })
  await axios.post('http://localhost:8088/login', { email, password })
}

login({ email: 'test@exampe.email', password: 'password' })

解決したコード:

const login = async ({ email, password }) => {
  await axios.get('http://localhost:8088/sanctum/csrf-cookie', { withCredentials: true })
  await axios.post('http://localhost:8088/login', { email, password }, { withCredentials: true })
}

login({ email: 'test@exampe.email', password: 'password' })

postでloginするときに withCredentialsを設定してなかっただけ。
defaultでtrueにしていればよかったのだろうけど、とりあえず動かすために書いていたので、気づくのにとても時間がかかってしまった。


ちなみに、Postmanでログインするまでで、すでにうまくいかない場合

  • PostmanでCacheが働いているか
  • HeaderにOriginかReferrerを設定しているか(どっちかないと必ず失敗する)
  • envやconfigのSESSION_DOMAINとSANCTUM_STATEFUL_DOMAINSは正しいか(入念に確認したほうがいい)

これらを確かめるとよい。

VSCodeの拡張のThunder Clientからテストしたかったが、これはうまく動かなかった。誰か教えてほしい。

Discussion