web-dev-qa-db-ja.com

AWS Cognitoを使用したマルチテナント認証

私の現在のプロジェクトは、LambdaでCognitoとマイクロサービスを使用するAWSにあります。 DDDを使用してマイクロサービスを設計し、基本的な機能を実装しています。

ただし、APIのユーザーが仕事をしているクライアント企業に分類され、そのクライアント企業のデータとロールベース認証のみにアクセスできるようにするビジネス上のニーズがあります。

すべてのユーザーが同じWebサイトで作業するため、これは完全なマルチテナントソリューションではありませんが、アカウントは特定のクライアントに関連付けられます。

AWSでこのようなことを行うことについて読んだことはすべて、クライアントごとに1つのユーザーロールまたはプールを使用し、作成時にユーザーを関連付けることを推奨していますが、クライアントは通常2〜3人のユーザーで構成されているため、多くのクライアントがいます。これは、ユーザープールの数の点ですぐに維持できなくなります。

ユーザーのマイクロサービスを呼び出すことで特定のユーザーによる各リクエストにクライアントデータを追加するためだけに設計されたドメインサービスをアーキテクチャに追加するなど、「従来の」手段を使用してこの問題を回避する方法を考えましたが、これは過度に思えます繁雑。また、各マイクロサービスに基本的なユーザーおよびロール情報を含めるようにアーキテクチャを変更することも検討しましたが、それは面倒です。

私の質問は、プログラムでAWS Cognitoプロファイルにデータを追加する公式にサポートされている方法はありますか?また、アカウントの作成後にクライアント管理者がフロントエンドWebサイトを介してこれを変更できる方法はありますか?たとえトークンのclientIdフィールドだけであっても。

そうでない場合、同様の問題を経験した人は、ユーザープールの提案に代わるものとして何を勧めますか。

ありがとうございました。

編集:

here のように、Cognitoプロファイルの属性を使用してこれを行ういくつかの方法も調査しています。これは私が達成しようとしていることを多かれ少なかれ行う方法のように思えますが、私はまだ代替案やアドバイスについて聞きたいです。

11
GallJ93

この問題に使用するソリューションは、Cognitoユーザー設定の一部としてカスタム属性を使用することです。ユーザーが属する追加の属性またはグループのテキストフィールドがあります。

これを実装する方法は、次のリンクで確認できます。

このデータがCognito資格情報の一部として各サービスに自動的に渡されるため、ユーザーが各クライアントに固有のデータにアクセスするための有効な資格情報を持っていることを確認できます。

NodeJSアプリケーションで(場合によってはサーバーレスで)Cognitoを操作する方法の例には、次のものがあります。

https://serverless-stack.com/chapters/login-with-aws-cognito.html

https://serverless-stack.com/chapters/add-a-create-note-api.html#configure-the-api-endpoint

これは aws-amplify パッケージを使用することで最も簡単に達成できるようです。これは主にフロントエンド認証用に設計されていますが、指定されたバックエンド認証用のNodeJSで使用できます ここ

18
GallJ93