🌊

vercelのプレビューURLでは、sessionの保存ができないみたい🤔

2021/09/17に公開

現在携わっているプロジェクトが、フロントNext.js, バックエンドrailsのジャムスタック構成です。

そこで、rails側で生成したsessionがブラウザのcookieに保存されない事件が起こり、解決に時間がかかったため、備忘録です。
(1ヶ月ほど時間が空いてしまったので、試したところは、覚えているものだけです、少し前後しているかも🙇‍♂️)
認証情報はブラウザのsessionで管理したいというものが前提のものです。

問題の発端

ユーザー新規登録した際に、sessionを生成し、ブラウザのcookieに保存して、ユーザー情報を扱いたかった。
そのため、railsのinitializers/cors.rbやinitializers/session_store.rbで許可ドメイン・セッション名の設定等々をした。
そして、vercelのプレビューURLで動作確認しようとすると、事件は起きた。

...保存されない。。

試した解決方法

まず、session_store.rbの設定を見直すことにした。

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)を設定
https://moto.hatenadiary.com/entry/subdomain-keep-session

session_store.rb
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で提供していたのでそちらを使い、

Gemfile
gem 'rails_same_site_cookie'
$ bundle install

これで再度確認してみると、sameSite=None, レスポンスにクッキーも載ってきてる!

きたー!って言いたいところなんですけど、検証ツールのApplicationのCookiesを見ると、

保存されてない...

これは手強い。。

解決

そして、なんやかんや格闘して行き着いたのが、下記の記事。
https://github.com/vercel/vercel/discussions/5290

結論、vercelのプレビュードメインでは無理そうなので、ドメイン作成してそれを使った方が早いよ〜、とのこと。

プロダクトのサブドメインを作成して、session_store.rbを、

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