vercelのプレビューURLでは、sessionの保存ができないみたい🤔
現在携わっているプロジェクトが、フロントNext.js, バックエンドrailsのジャムスタック構成です。
そこで、rails側で生成したsessionがブラウザのcookieに保存されない事件が起こり、解決に時間がかかったため、備忘録です。
(1ヶ月ほど時間が空いてしまったので、試したところは、覚えているものだけです、少し前後しているかも🙇♂️)
認証情報はブラウザのsessionで管理したいというものが前提のものです。
問題の発端
ユーザー新規登録した際に、sessionを生成し、ブラウザのcookieに保存して、ユーザー情報を扱いたかった。
そのため、railsのinitializers/cors.rbやinitializers/session_store.rbで許可ドメイン・セッション名の設定等々をした。
そして、vercelのプレビューURLで動作確認しようとすると、事件は起きた。
...保存されない。。
試した解決方法
まず、session_store.rbの設定を見直すことにした。
if Rails.env === 'production'
Rails.application.config.session_store :cookie_store, key: '_セッション名', domain: 'ドメイン名'
else
Rails.application.config.session_store :cookie_store, key: '_セッション名'
end
ここのプロダクトのドメイン名のとこに、サブドメインまで設定できるよ〜みたいな記事がたくさんあったので、vecelのドメイン([ランダムな文字列].vercel.app)を設定
if Rails.env === 'production'
Rails.application.config.session_store :cookie_store, key: '_セッション名', domain: '.vercel.app'
else
Rails.application.config.session_store :cookie_store, key: '_セッション名'
end
と変更。
しかし、動かず。
検証ツールのNetWorkタブを確認。
レスポンスにすら、cookieが載っていない。んーなんで、、
そして、sameSite属性がNoneでないことが判明。
これNoneにすれば、いけるんじゃ?
ってなることを予想していたかのように、railsがgemで提供していたのでそちらを使い、
gem 'rails_same_site_cookie'
$ bundle install
これで再度確認してみると、sameSite=None, レスポンスにクッキーも載ってきてる!
きたー!って言いたいところなんですけど、検証ツールのApplicationのCookiesを見ると、
保存されてない...
これは手強い。。
解決
そして、なんやかんや格闘して行き着いたのが、下記の記事。
結論、vercelのプレビュードメインでは無理そうなので、ドメイン作成してそれを使った方が早いよ〜、とのこと。
プロダクトのサブドメインを作成して、session_store.rbを、
if Rails.env === 'production'
Rails.application.config.session_store :cookie_store, key: '_セッション名', domain: '.本番のドメイン名'
else
Rails.application.config.session_store :cookie_store, key: '_セッション名'
end
に変更。
うまく行きました。
vercelのプレビューでうまくいかなかったのは、vecelの仕様?なのか?
(個人的な予想としては、vercelが発行したものだからvercelが所有権を持っているため弾かれる?)
終わりに
今回の件で、ステージング環境構築が大切って身に染みた。
学習段階で、絶対気づけなかったものが、実務だとバンバン出てくる。
自分が知ってることなんて、全体の1%いってるのか?ってぐらいの感覚。
Discussion