日本語
  • saas
  • コラボレーション
  • オーガニゼーション
  • rbac
  • マルチテナンシー

舞台裏: マルチテナントアプリでユーザーコラボレーションを実装する方法

マルチテナントアプリケーションで Logto Cloud のコラボレーションのような招待と役割アクセス管理機能を実装するための実践と洞察。

Charles
Charles
Developer

背景

先週、Logto Cloud で コラボレーション機能 を導入しました。もし見逃した場合は、ぜひチェックしてみてください!これで、既存の Logto テナントに同僚やチームメンバーを招待し、一緒にアプリケーションのアイデンティティシステムを維持することができるようになりました。

この機能リリースでは、各 Logto テナントに 2 つの役割を追加しました:

  • 管理者 (Admin): アイデンティティに関連するリソースの管理、他のメンバーの招待および管理、請求の処理、請求履歴の表示など、テナントへのフルアクセスが可能となります。
  • コラボレーター (Collaborator): アイデンティティ関連のリソースを管理できますが、他の管理機能にはアクセスできません。

私たちは自社ツールを活用するというコミットメントに基づき、RBAC (Role-Based Access Control) および Organizations 機能を活用して、ユーザーコラボレーションを構築しました。RBAC に馴染みがない場合は、以前の投稿 をご覧になってください。

このブログポストでは、この機能を実装する際に考慮した点について説明し、マルチオーガニゼーションアプリケーションを開発している場合にこの実践がどのように役立つかを紹介します。

Logto Cloud のコラボレーションは Logto Organizations で構築されています

各 Logto Cloud テナントは、私たちのシステム内で独立した組織として機能し、自社の Organizations 機能によって支えられています。テナント管理者およびコラボレーターの役割を導入するために、組織テンプレートに 2 つの組織役割を作成し、各役割には特定の組織権限を割り当てました。

組織役割
組織スコープ

Logto Management API を使用して招待を処理

オーガニゼーション機能には、招待に関連する一連の Management API を提供しています。これらの API を使用すると、例えば次のことが可能です:

  • POST /api/organization-invitations メールアドレスに組織招待を作成して送信
  • GET /api/organization-invitations および GET /api/organization-invitations/{id} で招待状を取得
  • PUT /api/organization-invitations/{id}/status 招待ステータスを更新して招待を承認または拒否

詳細については、完全な API ドキュメント を参照してください。

メールコネクタとの接続

招待はメールで送信されるため、メールコネクタが適切に設定されていることを確認してください。このリリースでは、新しいメールテンプレート使用タイプ OrganizationInvitation を導入し、招待メールテンプレートのカスタマイズを可能にしました。

招待メールサンプル

このメールテンプレートはデフォルトで {{link}} という変数を受け取り、ユーザーが招待を受け入れ Logto テナントに参加するための Logto コンソールのランディングページへのリンクとなります。Logto Cloud のランディングページの一例は以下のスクリーンショットです:

招待ランディングページ

招待メールを Management API 経由で送信する際の詳細については、API ドキュメント を参照してください。

RBAC を使用してユーザー権限を管理

上記のセットアップにより、メールを介して招待を送信し、招待された人は割り当てられた役割で組織に参加できるようになります。

異なる組織役割を持つユーザーは、アクセス トークン内で異なるスコープ (権限) を持つことになります。したがって、クライアント アプリケーション (Logto コンソール) およびバックエンド サービスの両方がこれらのスコープをチェックし、表示可能な機能や許可されるアクションを判断します。

さて、これで一見すべてがつながったようですが、他に何か見落としていませんか?

アクセストークンでのスコープ更新の扱い方

アクセストークン内でのスコープ更新の管理には、次の事項が含まれます:

  • 既存スコープの取り消し: たとえば、管理者を非管理者のコラボレーターに降格すると、既存のリフレッシュトークンで取得された新しいアクセストークン内のスコープが自動的に縮小されます。
  • 新しいスコープの付与: 逆に、ユーザーを管理者に昇進させる場合、その変化をユーザーのアクセス トークンに反映するために再ログインや再同意プロセスをトリガーする必要があります。

Logto Cloud では、コンソールが SWR リクエストを使用してユーザー スコープを積極的にチェックし、ユーザーが管理者に昇進した際には自動同意が行われます。

RBAC で同様の機能を実装する場合、スコープの更新を通知するための仕組み (例: WebSocket やサーバープッシュ イベント) が必要で、それにより再同意を行ったり、新しいアクセストークンを発行したりします。Logto では、今後のアップデートでこれをサポートする追加の Webhook も提供する予定です。

まとめ

Logto Cloud のマルチテナンシーおよびコラボレーション機能は、Organizations 機能を活用しています。同様のマルチテナント アプリケーションを開発している場合は、同様のアプローチでこの機能を利用することを検討してください。

このブログポストが役立つことを願っています。質問や議論がある場合は、ぜひ Discord チャンネル にご参加ください。