Slide 1

Slide 1 text

サービスバックエンドOSS Materia Takuto Yoshimura [email protected]

Slide 2

Slide 2 text

自己紹介 本名 吉村 拓人 カラビナテクノロジー株式会社 社内のあだ名は つちろー 元はJava の金融系SIer 昨年より顧問エンジニアとしてElixir でWeb システ ム開発はじめました

Slide 3

Slide 3 text

顧問エンジニアとは 月額定額で0 からのシステム開発をサポート Web サービス立ち上げのビジネスモデル構築など からお供いたします 数名の担当で複数のお客様のサービスを開発

Slide 4

Slide 4 text

2018 年の私

Slide 5

Slide 5 text

複数のお客様へ向けてWeb システム 開発を平行で行う日々

Slide 6

Slide 6 text

Phoenix が標準で担保しない、業務 システムでの必須機能 ユーザー認証機構(guardian) トランザクションスコープ 楽観/ 悲観排他ロジック etc

Slide 7

Slide 7 text

毎回実装するのがめんどくさ・・・

Slide 8

Slide 8 text

もとい、もっと開発生産性あげたい

Slide 9

Slide 9 text

共通機能作って再利用しよう

Slide 10

Slide 10 text

どうせならOSS として公開しよう

Slide 11

Slide 11 text

Materia とは 弊社カラビナテクノロジーで開発中の Elixir/Phoenix 製サービスバックエンドライブラリ SPA(Single Page Application) での開発を想定した バックエンドAPI を提供 サービスとして特色のないユーザー管理や認証と いった部分のバックエンド機能を個別開発せず に、本来実装したいサービスの特色となる機能の 開発に注力 Qiita 記事: Web サービスバックエンドライブラリー Materia

Slide 12

Slide 12 text

Materia ファイミリー構成 MateriaUtils: 日付変換、Ector ラッパー実装など各 種ユーティリティ Materia: アカウント管理、JWT 認証、権限管理 MateriaCommerce: 商品・価格・税情報、購入契 約管理 他追加開発中

Slide 13

Slide 13 text

サービス構築時の構成 OriginalService = MateriaUtils + Materia + MateriaHogeHoge + OriginalElixirCode

Slide 14

Slide 14 text

導入のステップ |> deps.get |> config 設定 |> migration ファイル生成 |> router.ex で必要な認証機構とAPI を定義 materia README

Slide 15

Slide 15 text

deps.get mix.exs defp deps do [ {:phoenix, "~> 1.3.2"}, ~ 中略 ~ {:cowboy, "~> 1.0"}, {:materia, "~> 0.1.2"} # add here ] > mix deps.get

Slide 16

Slide 16 text

con g 設定 jwt 認証(guardian) の設定 Repo の設定 参考 materia README Materia を導入してログイン認証してみる

Slide 17

Slide 17 text

migration ファイル作成 > mix guardian.db.gen.migration > mix materia.gen.migration > mix ecto.create > mix ecto.migrate > mix run priv/repo/seeds.exs

Slide 18

Slide 18 text

ルーティング設定 pipeline で認証ロジックの設定 pipeline :user_auth do plug Materia.UserAuthPipeline end pipe_through でAPI 毎にパイプラインを指定 scope "/api", MateriaWeb do pipe_through [ :api, :user_auth] get "/user", UserController, :show_me post "/grant", GrantController, :get_by_role end

Slide 19

Slide 19 text

ログインAPI リクエスト POST http://localhost:4000/api/sign-in HTTP/1.1 Content-Type: application/json { "email": "[email protected]", "password": "hogehoge" }

Slide 20

Slide 20 text

ログインAPI レスポンス HTTP/1.1 201 Created server: Cowboy date: Fri, 14 Dec 2018 08:16:32 GMT content-length: 740 content-type: application/json; charset=utf-8 cache-control: max-age=0, private, must-revalidate { "refresh_token": "hogehoge", "id": 1, "access_token": "fugafuga" }