Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Implementation of magic link login feature with...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
thori
October 08, 2019
Programming
1
620
Implementation of magic link login feature with sorcery gem
thori
October 08, 2019
Tweet
Share
Other Decks in Programming
See All in Programming
MDN Web Docs に日本語翻訳でコントリビュート
ohmori_yusuke
0
650
AI Schema Enrichment for your Oracle AI Database
thatjeffsmith
0
320
コントリビューターによるDenoのすゝめ / Deno Recommendations by a Contributor
petamoriken
0
210
HTTPプロトコル正しく理解していますか? 〜かわいい猫と共に学ぼう。ฅ^•ω•^ฅ ニャ〜
hekuchan
2
690
AgentCoreとHuman in the Loop
har1101
5
240
責任感のあるCloudWatchアラームを設計しよう
akihisaikeda
3
180
CSC307 Lecture 10
javiergs
PRO
1
660
React Native × React Router v7 API通信の共通化で考えるべきこと
suguruooki
0
100
Apache Iceberg V3 and migration to V3
tomtanaka
0
170
開発者から情シスまで - 多様なユーザー層に届けるAPI提供戦略 / Postman API Night Okinawa 2026 Winter
tasshi
0
210
副作用をどこに置くか問題:オブジェクト指向で整理する設計判断ツリー
koxya
1
610
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
610
Featured
See All Featured
Facilitating Awesome Meetings
lara
57
6.8k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
62
50k
Context Engineering - Making Every Token Count
addyosmani
9
660
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
170
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
71
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8.7k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
590
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.3k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
120
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
0
440
The Curious Case for Waylosing
cassininazir
0
240
Transcript
パスワードいらず、 sorceryでマジックリンクメールログイン 2019/10/9 堀 巧
Profile 堀 巧 / Takumi Hori テックリード@株式会社ライボ Ruby on Rails、Scala、Angular、 CakePHP、Docker、Vue.js
GitHub: @thori0908 Twitter: @hori_engineer 2
JobQ キャリアや転職に特化した匿名相談サービス • キャリアに関する相談 例、エンジニアになるか迷ってま す。。 • 企業の口コミ 例、あの会社の年収は? 社風は?
https://job-q.me 3
さらなる成長のためCakePHP2系からRailsへ移行中 色々あります手伝ってください... • CakePHP2系からRuby on Railsへ • jQuery廃止してVue.jsへ • インフラもEC2からECSへ
(dockerコンテナ化) • 仕様も変更 ◦ 使っていない機能削除 ◦ 使いやすいadmin画面に改善 4
エンジニア募集中! 5
admin画面のパスワード認証を楽にしたい パスワードあり • 簡単なパスワードにしてしまう 例、password, abcd1234 • パスワード管理ツール使う パスワードなし •
覚えなくて良い • セキュリティに強い • 探さなくて良い 6
マジックリンクメールで、 できます! 7
マジックリンクメールと は? 8
マジックリンクメールの仕組み • ユーザー登録後、フォームにemailを入力して送信する • マジックリンク付きメールが送られる • マジックリンクをクリックするとログインできる 9
どう実装するか 10
ユーザーとサーバーのやりとり マジックリンクメール click GET /login POST /login GET /auth/:token ログインフォーム
ログイントップ submit 送信完了画面 ユーザー側 サーバー側 11
必要なカラムをmigration • users.magic_login_token ◦ マジックリンクのtoken • users.magic_login_token_expires_at ◦ tokenの期限 •
users.magic_login_email_sent_at ◦ ログインメールの送信時刻 12
実装 GET /login 13
実装 POST /login • emailでDBからuserを取得 • token発行、tokenの期限設定 • ログインメールを送ってから、十分時間が立っているか ◦
hammering protectionという。(らしい • マジックリンクメールを送信 14
実装 GET /auth/:token • tokenでDBからuserを取得 • userのmagic_login_tokenとmagic_login_token_expires_at をNULLにする ◦ tokenは一度だけ使用できる
◦ セキュリティのため • ログイントップへリダイレクト 実装おしまい。 15
sorceryのsubmodule が便利です! (Readmeはないようですが作者の記事があります。 https://qiita.com/tonishi/items/832dbd6c1a0a012519fd 16
sorceryのsubmodule MagicLoginを使う • configファイル ◦ マジックログインに使うメールを指定 ◦ tokenの有効時間設定 • 必要なカラムを追加するmigrationファイル用意
◦ magic_login_token ◦ magic_login_token_expires_at ◦ magic_login_email_sent_at 17
sorceryの便利メソッド • deliver_magic_login_instructions! ◦ hammering protection ◦ ログインtoken発行、token期限指定 ◦ マジックリンクメール送信
• load_from_magic_login_token ◦ tokenでuserモデルを取得 ◦ tokenの期限をチェック • generate_magic_login_token ◦ token発行 18
運用時の懸念 19
運用時の問題 開発時運用 • 開発環境でメールを送信して、受け 取るのが面倒 ->ログにメールの内容を吐き出す 本番時運用 • メールが送られなくなったら、ユー ザーはログインできない
->スパム認定されないよう用心 20
まとめ • マジックリンクログインでパスワード管理から解放される • マジックリンク付きのメールを送るだけ • sorceryを使うと便利 21
おまけ passwordlessというgemでも実装できるらしい。 https://github.com/mikker/passwordless passwordlessはdeviseと併用できないらしい https://github.com/mikker/passwordless/issues/9 22