LoginSignup
9
5

More than 3 years have passed since last update.

Phoenixでcookieを取得/発行(システム間連携やサードパーティcookie利用、レガシーシステム接続で役立つ)

Last updated at Posted at 2019-07-04

fukuoka.exのpiacereです
ご覧いただいて、ありがとうございます :bow:

最近、cookieって、使ってますか?

SPA化が進んだことにより、より手軽なWebStorageや、ブラウザやPC/スマホを選ばない「認証+GCS/S3/各種DB」でのサーバサイドへのユーザデータ保持が台頭し、昔ほどcookieを使わなくなっています

更に、LiveViewを使うと、もはやフロント側にデータを置く機会そのものが無くなり、ますますcookieから、遠ざかる訳です

そんな中、複数SaaSを跨ぐシステム間連携の開発にて、久々にcookieを使う要件が出てきて、「アレ?…Phoenixでcookieって、どう扱うんだっけ?」となったので、調べて、実装したので、その内容をシェアします

なお、「Phoenix」は、ElixirのWebフレームワークです

内容が、面白かったり、役に立ったら、「いいね」よろしくお願いします :wink:

本コラムの検証環境、事前構築のコマンド

本コラムは、以下環境で検証しています(Windowsで実施していますが、Linuxやmacでも動作する想定です)

なお、コラム中のサンプルは、コチラの構築手順で、Phoenix PJを構築している前提で解説します

cookie発行/取得の処理を入れる対象

cookieは、Webページで発行/取得するので、Webページの関連処理が対象となります

index.html.eexを対象に解説しますが、実際にコードを入れる箇所は、コントローラになります

※変更前 lib/sample_db_web/controllers/page_controller.ex
defmodule SampleDbWeb.PageController do
  use SampleDbWeb, :controller

  def index(conn, _params) do
    render(conn, "index.html")
  end
end

cookieの取得

まず、cookieの取得からいきます

conn.cookiesにマップとして、全cookieが格納されているので、キー指定することで、値が取得できます

※変更後① lib/sample_db_web/controllers/page_controller.ex
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を残さない発行になります

※変更後① lib/sample_db_web/controllers/page_controller.ex
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を同時発行することもできます

※変更後② lib/sample_db_web/controllers/page_controller.ex
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.「いいね」よろしくお願いします

ページ左上の image.pngimage.png のクリックを、どうぞよろしくお願いします:bow:
ここの数字が増えると、書き手としては「ウケている」という感覚が得られ、連載を更に進化させていくモチベーションになりますので、もっとElixirネタを見たいというあなた、私達と一緒に盛り上げてください!:tada:

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5