fukuoka.exのpiacereです
ご覧いただいて、ありがとうございます
最近、cookieって、使ってますか?
SPA化が進んだことにより、より手軽なWebStorageや、ブラウザやPC/スマホを選ばない「認証+GCS/S3/各種DB」でのサーバサイドへのユーザデータ保持が台頭し、昔ほどcookieを使わなくなっています
更に、LiveViewを使うと、もはやフロント側にデータを置く機会そのものが無くなり、ますますcookieから、遠ざかる訳です
そんな中、複数SaaSを跨ぐシステム間連携の開発にて、久々にcookieを使う要件が出てきて、「アレ?…Phoenixでcookieって、どう扱うんだっけ?」となったので、調べて、実装したので、その内容をシェアします
なお、「Phoenix」は、ElixirのWebフレームワークです
内容が、面白かったり、役に立ったら、「いいね」よろしくお願いします
本コラムの検証環境、事前構築のコマンド
本コラムは、以下環境で検証しています(Windowsで実施していますが、Linuxやmacでも動作する想定です)
- Windows 10
- Elixir 1.8.1 ※最新版のインストール手順はコチラ
- Phoenix 1.4.8 ※最新版のインストール手順はコチラ
なお、コラム中のサンプルは、コチラの構築手順で、Phoenix PJを構築している前提で解説します
cookie発行/取得の処理を入れる対象
cookieは、Webページで発行/取得するので、Webページの関連処理が対象となります
index.html.eexを対象に解説しますが、実際にコードを入れる箇所は、コントローラになります
defmodule SampleDbWeb.PageController do
use SampleDbWeb, :controller
def index(conn, _params) do
render(conn, "index.html")
end
end
cookieの取得
まず、cookieの取得からいきます
conn.cookiesにマップとして、全cookieが格納されているので、キー指定することで、値が取得できます
defmodule SampleDbWeb.PageController do
use SampleDbWeb, :controller
def index(conn, _params) do
# v---add here
single_signon_id = conn.cookies[ "single_signon_id" ]
# ここに取得したcookieの処理を入れる
render(conn, "index.html")
end
end
カンタンです
cookieの発行
次は、cookieの発行です
connを、Plug.Conn.put_resp_cookie()に通すことで、レスポンスにcookieを付与し、cookie発行できます
なお、「http_only: false」を外すか、trueを設定すると、ブラウザ側にcookieを残さない発行になります
defmodule SampleDbWeb.PageController do
use SampleDbWeb, :controller
def index(conn, _params) do
# v---add here
conn_cookie = conn |> put_resp_cookie( "single_signon_id", "ThisIsID", [ http_only: false ] )
render(conn_cookie, "index.html")
# ^---modify here
end
end
Elixirらしく、パイプを使うことで、複数のcookieを同時発行することもできます
defmodule SampleDbWeb.PageController do
use SampleDbWeb, :controller
def index(conn, _params) do
# v---add here
conn_cookie = conn
|> put_resp_cookie( "single_signon_id", "ThisIsID", [ http_only: false ] )
|> put_resp_cookie( "single_signon_apps", "mail,chat", [ http_only: false ] )
# ^---add here
render(conn_cookie, "index.html")
# ^---modify here
end
end
終わり
Phoenixでのcookieの扱いについて、まとめました
SPAもしくはサーバサイド保持が全盛とは言え、システム間連携やサードパーティcookie利用、レガシーシステム接続で利用する機会はあると思うので、覚えておいて損は無いかと思います
p.s.「いいね」よろしくお願いします
ページ左上の や
のクリックを、どうぞよろしくお願いします
ここの数字が増えると、書き手としては「ウケている」という感覚が得られ、連載を更に進化させていくモチベーションになりますので、もっとElixirネタを見たいというあなた、私達と一緒に盛り上げてください!