Implementation of magic link login feature with sorcery gem

62d2fdd017335e36821a8c7c1b936876?s=47 thori
October 08, 2019

Implementation of magic link login feature with sorcery gem

62d2fdd017335e36821a8c7c1b936876?s=128

thori

October 08, 2019
Tweet

Transcript

  1. パスワードいらず、 sorceryでマジックリンクメールログイン 2019/10/9 堀 巧

  2. Profile 堀 巧 / Takumi Hori テックリード@株式会社ライボ Ruby on Rails、Scala、Angular、 CakePHP、Docker、Vue.js

    GitHub: @thori0908 Twitter: @hori_engineer 2
  3. JobQ キャリアや転職に特化した匿名相談サービス • キャリアに関する相談 例、エンジニアになるか迷ってま す。。 • 企業の口コミ 例、あの会社の年収は?   社風は?

    https://job-q.me 3
  4. さらなる成長のためCakePHP2系からRailsへ移行中 色々あります手伝ってください... • CakePHP2系からRuby on Railsへ • jQuery廃止してVue.jsへ • インフラもEC2からECSへ

    (dockerコンテナ化) • 仕様も変更 ◦ 使っていない機能削除 ◦ 使いやすいadmin画面に改善 4
  5. エンジニア募集中! 5

  6. admin画面のパスワード認証を楽にしたい パスワードあり • 簡単なパスワードにしてしまう 例、password, abcd1234 • パスワード管理ツール使う パスワードなし •

    覚えなくて良い • セキュリティに強い • 探さなくて良い 6
  7. マジックリンクメールで、 できます! 7

  8. マジックリンクメールと は? 8

  9. マジックリンクメールの仕組み • ユーザー登録後、フォームにemailを入力して送信する • マジックリンク付きメールが送られる • マジックリンクをクリックするとログインできる 9

  10. どう実装するか 10

  11. ユーザーとサーバーのやりとり マジックリンクメール click GET /login POST /login GET /auth/:token ログインフォーム

    ログイントップ submit 送信完了画面 ユーザー側 サーバー側 11
  12. 必要なカラムをmigration • users.magic_login_token ◦ マジックリンクのtoken • users.magic_login_token_expires_at ◦ tokenの期限 •

    users.magic_login_email_sent_at ◦ ログインメールの送信時刻 12
  13. 実装 GET /login 13

  14. 実装 POST /login • emailでDBからuserを取得 • token発行、tokenの期限設定 • ログインメールを送ってから、十分時間が立っているか ◦

    hammering protectionという。(らしい • マジックリンクメールを送信 14
  15. 実装 GET /auth/:token • tokenでDBからuserを取得 • userのmagic_login_tokenとmagic_login_token_expires_at をNULLにする ◦ tokenは一度だけ使用できる

    ◦ セキュリティのため • ログイントップへリダイレクト 実装おしまい。 15
  16. sorceryのsubmodule が便利です! (Readmeはないようですが作者の記事があります。 https://qiita.com/tonishi/items/832dbd6c1a0a012519fd 16

  17. sorceryのsubmodule MagicLoginを使う • configファイル ◦ マジックログインに使うメールを指定 ◦ tokenの有効時間設定 • 必要なカラムを追加するmigrationファイル用意

    ◦ magic_login_token ◦ magic_login_token_expires_at ◦ magic_login_email_sent_at 17
  18. sorceryの便利メソッド • deliver_magic_login_instructions! ◦ hammering protection ◦ ログインtoken発行、token期限指定 ◦ マジックリンクメール送信

    • load_from_magic_login_token ◦ tokenでuserモデルを取得 ◦ tokenの期限をチェック • generate_magic_login_token ◦ token発行 18
  19. 運用時の懸念 19

  20. 運用時の問題 開発時運用 • 開発環境でメールを送信して、受け 取るのが面倒 ->ログにメールの内容を吐き出す 本番時運用 • メールが送られなくなったら、ユー ザーはログインできない

    ->スパム認定されないよう用心 20
  21. まとめ • マジックリンクログインでパスワード管理から解放される • マジックリンク付きのメールを送るだけ • sorceryを使うと便利 21

  22. おまけ passwordlessというgemでも実装できるらしい。 https://github.com/mikker/passwordless passwordlessはdeviseと併用できないらしい https://github.com/mikker/passwordless/issues/9 22