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

[fukuoka.ex](https://fukuokaex.connpass.com/)のpiacereです
ご覧いただいて、ありがとうございます :bow:

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

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

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

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

なお、[「Phoenix」](https://qiita.com/piacerex/items/b7787580fce5f148242f#phoenix%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)は、ElixirのWebフレームワークです

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

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

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

- Windows 10
- Elixir 1.8.1　 　　　　 ※<b>[最新版のインストール手順はコチラ](https://qiita.com/piacere_ex/items/6714e1440e3f25fb46a1#%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99elixir%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)</b>
- Phoenix 1.4.8　　　　※<b>[最新版のインストール手順はコチラ](https://qiita.com/piacerex/items/b7787580fce5f148242f#phoenix%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)</b>

なお、コラム中のサンプルは、[コチラの構築手順で、Phoenix PJを構築している前提](https://qiita.com/piacerex/items/ff3c95b5600dfc20ca58)で解説します

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

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

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

```elixir:※変更前　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が格納されているので、キー指定することで、値が取得できます

```elixir:※変更後①　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を残さない発行になります

```elixir:※変更後①　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を同時発行することもできます

```elixir:※変更後②　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.png](https://qiita-image-store.s3.amazonaws.com/0/155423/4d515047-cc48-382e-c2b1-3ad0cc50dbbf.png) や ![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/a4e3da58-70a3-4197-95a2-6a6906650d01.png) のクリックを、どうぞよろしくお願いします:bow:
ここの数字が増えると、書き手としては「ウケている」という感覚が得られ、連載を更に進化させていくモチベーションになりますので、もっとElixirネタを見たいというあなた、私達と一緒に盛り上げてください！:tada: