3行で
- あるところに、ログイン中のユーザーと Apple アカウントを連携したい Web アプリがありました。
- OIDC
Sign in With Appleの Callback URL には POST リクエストがやってくる。 - Chrome の SameSite 属性のデフォルトである
Laxでは Set-Cookie の2分間以降は POST に乗らなくなる。
ChromeでSign in With Appleが連携できない?
WebアプリケーションにSign in With Appleを実装し、既存のログインアカウントに連携しようとした際、未ログイン扱いとなり連携に失敗する不具合に遭遇しました。
詳しく調べるとこの問題は Chrome でのみ起こっており、要因はログインセッションに使う Cookie が送信されていなかったことでした。
Sign in With Appleでは、コールバック URL に POST リクエストでデータが渡ってきます。
そのときログインセッションの Cookie にSameSite属性を指定していなかったため、ブラウザのデフォルト設定が適用されていました。
Chrome のSameSite属性のデフォルトはLaxです。Laxは基本的に POST リクエストでは Cookie を送信しませんが、例外として Cookie を設定してから2分間だけは POST でも Cookie が付与されるという仕様になっていました。
一方 Safari や Firefox はデフォルトがNoneとなっており、同様の不具合は発生していませんでした。
つまり、Chrome では「ログインしてから2分間経過するとSign in With Appleが連携できなくなる」という事象が起こっていたのです。
今度は手元でログインできない?
SameSite=Noneを指定して不具合を解決したところ、今度は Chrome から手元のローカル環境にログインができなくなりました。
原因はhttp環境での動作確認を残すためにSecure属性を設定していなかったことでした。
SameSite=Noneを指定しているとき、Secure属性がないと Chrome がSet-Cookieを無視してしまいログイン状態を維持できなかったのです。
幸い今回のアプリケーションには、https 環境をローカルにも用意していたので素早くSecure属性を有効にすることができました。