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
マルチテナントSaaSのカスタム要件に、 Auth0テナントを分割せず向き合う! / Mult...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
hiroga
August 10, 2022
Technology
3.4k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
マルチテナントSaaSのカスタム要件に、 Auth0テナントを分割せず向き合う! / Multi tenant SaaS with Auth0
hiroga
August 10, 2022
More Decks by hiroga
See All by hiroga
Lip Reading with LLMs? Visual Speech Recognition
hiroga
0
90
Gaussian Splatting Hands-on
hiroga
0
120
マルチモーダル理解と生成の統合 DeepSeek Janus, etc... / Multimodal Understanding and Generation Integration
hiroga
0
770
LlamaGen: LlamaのNext-Token予測を使った画像生成 / Autoregressive Model Beats Diffusion: Llama for Scalable Image Generation
hiroga
0
630
人事評価GPTsで評価の本質に向き合おう! / HR GPTs: Essential evaluations focus!
hiroga
1
480
生成AI元年を個人的に振り返る / Reflecting on First Year of the Generative-AI
hiroga
0
450
AWS Startup Day 2023 今日ここで! コスト削減ハンズオン / Cost-Saving Hands-On today!
hiroga
0
190
ChatGPT社内活用資料 / Internal use of ChatGPT
hiroga
0
200
雑な攻撃からELBを守る一工夫 +おまけ / Know-how to protect servers from miscellaneous attacks
hiroga
0
2.9k
Other Decks in Technology
See All in Technology
KPIだけでは評価できないプロダクトが考えるべき Evalsという第二の評価系 / Beyond KPIs: Evals as a Second Evaluation Framework for Products #PdEConf
aki_iinuma
4
3.8k
多摩川(.dev)ランニング入門 / Tamagawa.dev#3
fujiwara3
3
410
WAF 運用改善の承認サイクル/SRE_BizReach_MIXI_1
visional_engineering_and_design
2
370
Amazon S3 Tablesに全部任せてみた結果——コンパクション/スナップショット管理は本当に手放せるか
shigeruoda
0
420
Snowflakeのコスト最適化を支えるアーキテクチャ設計
ktatsuya
0
820
Sigmaユーザーのための有用リソース一挙公開 & Sigmaで使えるMCP #sigma_ucj /useful-resources-for-sigma-computing-users-and-mcps-with-sigma
shinyaa31
0
160
Azure Cost Management の FOCUS コストデータを迷わず読むための“3つの軸”
tetsuyaooooo
0
160
AI時代に、プロダクトの数だけ積み上がる所有コストをどうエンジニアリングするか / Engineering the Cost of Ownership
kzkmaeda
1
1.1k
Code4Lib JAPANカンファレンス2026 開会挨拶 / Code4Lib JAPAN Conference 2026: Opening Remarks
ykiyota
0
220
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
3
330
『止めない』を設計する — 制約の中で、事業の根幹を支える判断
hiroyaterui
0
230
Bet AI Day 2026丨AIを「使う」から、AIが「働く」へ ― LayerXが進める「組織AI」の社会実装
layerx
PRO
3
2.8k
Featured
See All Featured
Measuring & Analyzing Core Web Vitals
bluesmoon
9
990
It's Worth the Effort
3n
188
29k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
520
New Earth Scene 8
popppiees
3
2.5k
Raft: Consensus for Rubyists
vanstee
141
7.7k
Designing for humans not robots
tammielis
254
26k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
270
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
How to Think Like a Performance Engineer
csswizardry
28
2.8k
Transcript
\ 積極採用中 / @xhiroga(小笠原寛明) justInCase Technologies, Inc. マルチテナントSaaSのカスタム要件に、 Auth0テナントを分割せず向き合う! Okta
Study Meetup #4 「Auth0で実装する認証と認可」@ 2022-08-10
\ 採用中 / 目次 • ごあいさつ • なぜマルチテナントなのか • なぜAuth0なのか
• カスタム要件にAuth0テナントを分割せず向き合う ◦ 認証のカスタム要件 ◦ セキュリティのカスタム要件 ◦ 画面のカスタム要件 ◦ 開発と運用 • まとめ • おしらせ 1
\ 採用中 / ごあいさつ 自己紹介 2
\ 全職種採用中 / 3
\ 採用中 / ごあいさつ 日本初の商品を連発している保険会社です。 4
\ 採用中 / ごあいさつ そのノウハウを元に保険SaaSを提供しています。 5 顧客 保険会社* *事業会社や保険代理店 のご利用も可能
プラン選択 本人認証 告知・重要事項説明 会員資格確認 商品ページ(LP) & 申込フォーム 契約参照 異動・解約 決済 契約更新 お客様 ポータル 査定・承認 問合せ 提出書類の参照 (電子データ) 支払記録 保険金 請求フォーム
\ 採用中 / 会社紹介 保険業務をSaaSでなめらかにし、みなさんがよい保険にアクセスしやすいようにしています。 6
\ あなたと一緒に働きたい! / なぜマルチテナントなのか
\ 採用中 / なぜマルチテナントなのか 規模によらず、様々な保険会社のお客様に ご利用いただくため 8
\ あなたと一緒に働きたい! / なぜAuth0なのか
\ 採用中 / なぜAuth0なのか マルチテナントとは、リクエスト単位でアプリケーションを分割すること 10 {tenant_id: justincase} API DB
token なるほど、 justinacaseテナントとして 起動すればいいのか!
\ 採用中 / なぜAuth0なのか マイクロサービスでは、ID管理サービスには複数のアクセスがある 11 マイクロサービス1 マイクロサービス2 ID管理サービス token
トークン検証 複数のサービスが ID管理サービスにアクセス
\ 採用中 / なぜAuth0なのか 開発が大変 12 OAuth, OIDC準拠が大変 ログイン画面の開発が大変 MFA・IP制限などが大変
\ 採用中 / なぜAuth0なのか エンタープライズに耐えうるIDaaSを比較した 13 参考: 髙栁怜士. “認証サービスCognito・Auth0・Firebaseを比べる” https://techbookfest.org/product/6354233804718080.
Pros Cons Auth0 ドキュメント・SDK・ログイン画面が優れている。 リージョンで日本を指定できる 他の選択肢に比べてコストが高い Amazon Cognito UserPool 東京リージョンを指定できる、安価 歴史的経緯もありドキュメントが分かりづらい Google Identity Platform 安価 リージョンを指定できない Firebase Authentication 安価 リージョンを指定できない
\ 採用中 / なぜAuth0なのか 開発者体験が良い 14 • Auth0を触れる(※1)メンバーの数 ◦ 2ヶ月で4名→10名(以上!)に増加!
◦ うちSREは3名のみ、ほかはフロントエンド、PdM、バックエンド • Auth0に関するチケット ◦ スクラムのあるスプリントでは、15枚のチケットを6名以上で分担! • Auth0のサポート ◦ 体感で2日程度で返答、日本語でサポート頂ける場合も!
\ あなたと一緒に働きたい! / 認証のカスタム要件
\ 採用中 / 認証のカスタム要件 保険会社によって要件が異なる 16 • パスワードに含まれるべき文字の種類 • パスワードの長さ
• パスワードの再利用の可否 • パスワードにメールアドレスなどと同じ文字列が含まれてよいか • LINEログインなどのソーシャルログインの有無 • Azure ADなどのSSOの有無 • セッションの長さ • IP制限 • MFAの有無 • MFAの手段 • etc…
\ 採用中 / 認証のカスタム要件 Auth0におけるマルチテナントの実装方法 17 分け方 Pros Cons Auth0テナントで分ける
ダッシュボードへの直アクセスを含む、テナ ントの要件に柔軟に対応可能 運用コストがかかりすぎる Auth0 Organizationで分ける toBであれば便利 toCには使えない Auth0 Applicationで分ける Branding対応などを見るに公式推奨 運用コストがややかかる DB Connectionで分ける 同じメールアドレスでテナントごとに別ユー ザーを作成できる DB Connectionにはメタデータがない User Metadataで分ける 最も作成するリソースが少ない カスタムの幅が限られる
\ 採用中 / (意訳) Auth0は、企業間取引(B2B)のお客様がパートナーや顧客をより適切に管理し、エンドユーザーが自社のアプリケーショ ンにアクセスする方法をカスタマイズできるようにするため、Auth0プラットフォームの幅広いアップデートを実施しました。 Auth0のお客様は、Organizationを利用して以下のことが可能です。 • 顧客やパートナーをAuth0に登録し、その所属や権限などを管理する。 •
ビジネスごとに異なるロゴや色を使ってログインフローをブランディングできる。 • Organizations APIを使用して、自社製品に管理機能を組み込み、企業が自社組織を管理できるようにする。 認証のカスタム要件 Organizationとは 18 参考: Auth0, Inc. “Auth0 Organizations” https://auth0.com/docs/manage-users/organizations
\ 採用中 / 認証のカスタム要件 Organizationへの(個人的な)誤解 19 △複数テナント所属を可能にする機能 Organization登場以前、テナントごとにAuth0 Applicationを分ける設計が一般的。 →
1ユーザーが複数テナントに所属できない。 参考: urmot. “Auth0 Organizationsという素晴らしい機能を今更ながら紹介する .” Zenn. https://zenn.dev/urmot/articles/8c18d8b49d822c 加藤. “B2BマルチテナントSaaSの認証にAuth0を使うときに知っておきたかったこと ”. Sansan Tech Blog. https://buildersbox.corp-sansan.com/entry/2020/04/22/110000 ◎それ以外にもB2Bの便利機能がたくさん! • 複数テナントに所属できる • セルフサインアップを無効に • Eメールでの招待 • アクセストークンにOrganizationId • Organization単位のメタデータ • Organization単位のロゴ・色
\ 採用中 / 認証のカスタム要件 最終的なアーキテクチャ 20 マイページ (toC) 管理画面 (toB)
Application Application テナント別に DB Connection toCとtoBで テナントを分ける
\ あなたと一緒に働きたい! / セキュリティのカスタム要件
\ 採用中 / セキュリティのカスタム要件 【再掲】保険会社によって要件が異なる 22 • パスワードに含まれるべき文字の種類 • パスワードの長さ
• パスワードの再利用の可否 • パスワードにメールアドレスなどと同じ文字列が含まれてよいか • LINEログインなどのソーシャルログインの有無 • Azure ADなどのSSOの有無 • セッションの長さ • IP制限 • MFAの有無 • MFAの手段 • etc…
\ 採用中 / セキュリティのカスタム要件 【再掲】保険会社によって要件が異なる 23 • パスワードに含まれるべき文字の種類 • パスワードの長さ
• パスワードの再利用の可否 • パスワードにメールアドレスなどと同じ文字列が含まれてよいか • LINEログインなどのソーシャルログインの有無 • Azure ADなどのSSOの有無 • セッションの長さ • IP制限 • MFAの有無 • MFAの手段 • etc… Actionで対応可能!
\ 採用中 / ◎Actionのメリット • ドラッグ&ドロップで分かりやすい設定 • インターネット上のnpmのパッケージが使える • エディタが高性能、型から予測変換表示も
• バージョン管理 • etc… セキュリティのカスタム要件 RuleではなくActionを使おう 24 Rules Hooks Actions 参考: Auth0, Inc. “Introducing Auth0 Actions”. Auth0. https://auth0.com/blog/introducing-auth0-actions/
\ 採用中 / exports.onExecutePostLogin = async (event, api) => {
console.log('onExecutePostLogin'); const { user } = event; if (user.email_verified) { return; } const ManagementClient = require('auth0').ManagementClient; const management = new ManagementClient({ domain: event.secrets.domain, clientId: event.secrets.clientId, clientSecret: event.secrets.clientSecret, }); const { SESClient, SendEmailCommand } = require('@aws-sdk/client-ses'); // 以下省略 セキュリティのカスタム要件 Actionの実例 25 npmのパッケージが使えるので、 AWSと直接接続することも可能!
\ 採用中 / セキュリティのカスタム要件 制約も存在する 26 • パスワードに含まれるべき文字の種類 • パスワードの長さ
• パスワードの再利用の可否 • パスワードにメールアドレスなどと同じ文字列が含まれてよいか • LINEログインなどのソーシャルログインの有無 • Azure ADなどのSSOの有無 • セッションの長さ • IP制限 • MFAの有無 • MFAの手段 • etc… どれを優先的に使うかは設定不可。 (複数のMFAの手段があった場合どれを使うかは Auth0に 任せるべきというポリシーと推察 ...せめてOrganization単 位で有効化の設定をさせて〜!)
\ あなたと一緒に働きたい! / 画面のカスタム要件
\ 採用中 / 画面のカスタム要件 サインアップ画面に利用規約を表示したいだって!? 28 ここに 「利用規約」 「プライバシーポリシー」 を表示したいって...!?
\ 採用中 / 画面のカスタム要件 ULPのカスタマイズへの勘違い 29 HTMLをカスタマイズできる が...Classic ULPしか編集できな い!
\ 採用中 / 画面のカスタム要件 New ULPを使おう! (意訳) Auth0の新しいユニバーサルログインエクスペリエンスは、新鮮なUXデザインと軽量なページで、ログインフローを再構築 しています。この新しいエクスペリエンスを選択すると、Auth0はカスタマイズされていないすべてのページでこのエクスペ リエンスを使用します。ダッシュボードのブランディング
> ユニバーサルログイン設定タブで有効にすることができます。 30
\ 採用中 / <body class="_widget-auto-layout _hide-prompt-logo"> <!-- 省略 --> {%
if transaction.params.ext-disableSignup == "true" and prompt.name == "login" %} <script> document .querySelectorAll('a') .forEach( (link) => link.innerText === '{{ prompt.screen.texts.footerLinkText }}' && link.parentElement.remove(), ); </script> {% endif %} </body> 画面のカスタム要件 勝手に改造 31 改造の例: ログイン画面を表示中 かつ パラメータ disableSignup が true なら サインアップボタンを表示しない ※Auth0サポート対象外
\ あなたと一緒に働きたい! / 開発と運用
\ 採用中 / 開発と運用 ユーザーにテナントを選ばせたくない 33 前画面の入力を元に テナントを識別 サブドメインなどを元に テナントを識別
\ 採用中 / 環境変数で静的に設定 開発と運用 動的にAuth0の設定を変えよう 34 URLを見て動的に設定
\ 採用中 / 開発と運用 実は nextjs-auth0 が使いたかった 35 nextjs-auth0はフロントエンドでアクセ ストークンを持たず、よりセキュア。
ただし動的にAuth0Settingを行うこと はできない...
\ あなたと一緒に働きたい! / まとめ
\ 採用中 / まとめ Auth0を使うことで、マルチテナントのカスタム要件を運用しやすい方法で実現できた! 37 • チームメンバーのキャッチアップが容易 • DB
Connectionを分けることで認証のカスタマイズが可能 • Actionを利用することでセキュリティ面のカスタマイズが可能 • ULPのテンプレートを編集することでログイン画面のカスタマイズが可能
\ あなたと一緒に働きたい! / おしらせ
\ 採用中 / おしらせ 採用中です! 39
\ 採用中 / おしらせ 書籍化します! 40 今日しなかった マルチテナント以外の話も 満載!
\ あなたと一緒に働きたい! / EOL