舞台裏: マルチテナントアプリでユーザーコラボレーションを実装する方法
マルチテナントアプリケーションで Logto Cloud のコラボレーションのような招待と役割アクセス管理機能を実装するための実践と洞察。
マルチテナントアプリケーションで Logto Cloud のコラボレーションのような招待と役割アクセス管理機能を実装するための実践と洞察。
先週、Logto Cloud で コラボレーション機能 を導入しました。もし見逃した場合は、ぜひチェックしてみてください!これで、既存の Logto テナントに同僚やチームメンバーを招待し、一緒にアプリケーションのアイデンティティシステムを維持することができるようになりました。
この機能リリースでは、各 Logto テナントに 2 つの役割を追加しました:
私たちは自社ツールを活用するというコミットメントに基づき、RBAC (Role-Based Access Control) および Organizations 機能を活用して、ユーザーコラボレーションを構築しました。RBAC に馴染みがない場合は、以前の投稿 をご覧になってください。
このブログポストでは、この機能を実装する際に考慮した点について説明し、マルチオーガニゼーションアプリケーションを開発している場合にこの実践がどのように役立つかを紹介します。
各 Logto Cloud テナントは、私たちのシステム内で独立した組織として機能し、自社の Organizations 機能によって支えられています。テナント管理者およびコラボレーターの役割を導入するために、組織テンプレートに 2 つの組織役割を作成し、各役割には特定の組織権限を割り当てました。


オーガニゼーション機能には、招待に関連する一連の 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 ドキュメント を参照してください。
上記のセットアップにより、メールを介して招待を送信し、招待された人は割り当てられた役割で組織に参加できるようになります。
異なる組織役割を持つユーザーは、アクセス トークン内で異なるスコープ (権限) を持つことになります。したがって、クライアント アプリケーション (Logto コンソール) およびバックエンド サービスの両方がこれらのスコープをチェックし、表示可能な機能や許可されるアクションを判断します。
さて、これで一見すべてがつながったようですが、他に何か見落としていませんか?
アクセストークン内でのスコープ更新の管理には、次の事項が含まれます:
Logto Cloud では、コンソールが SWR リクエストを使用してユーザー スコープを積極的にチェックし、ユーザーが管理者に昇進した際には自動同意が行われます。
RBAC で同様の機能を実装する場合、スコープの更新を通知するための仕組み (例: WebSocket やサーバープッシュ イベント) が必要で、それにより再同意を行ったり、新しいアクセストークンを発行したりします。Logto では、今後のアップデートでこれをサポートする追加の Webhook も提供する予定です。
Logto Cloud のマルチテナンシーおよびコラボレーション機能は、Organizations 機能を活用しています。同様のマルチテナント アプリケーションを開発している場合は、同様のアプローチでこの機能を利用することを検討してください。
このブログポストが役立つことを願っています。質問や議論がある場合は、ぜひ Discord チャンネル にご参加ください。