REST開発するファーストパーティクライアントと将来的にサードパーティクライアントで使用されるAPIの開発に取り組んでいます。ファーストパーティクライアントには、SPAクライアント側のアプリケーションとプログラムが含まれていますクライアントPCで実行されます(シークレットのセキュリティは保証できません)。
さらに、このAPIは疑似マルチテナントです。複数のテナントがあり、各テナントは1つ以上のアクティブなインスタンスをAPIに持つことができ、それぞれに独自のセキュリティロールのセットがあり、それぞれにさまざまな権限があります。ただし、このデータはすべて同じデータベースに保存されるため、ユーザーは作業中のインスタンス(テナント内とテナント外の両方)を切り替えることができます。ログインは、サードパーティプロバイダー(Facebook/Googleなど)を使用して許可できます。また、サインインにより、再認証なしで他のインスタンスにアクセスできるようになります。
APIのマルチテナント/マルチロールの性質を考慮して、認証/承認ロジックをどのように実装するべきかについて、少し混乱しています。 OpenID Connect認証をAPIに実装し、OAuthを使用して、ユーザーが試行している特定のインスタンスへのアクセスを委任するのが正しい方法だと私が考えていることです。私の混乱は、どのトークンをどこで使用するかを決定しようとしていますが、ユーザーがSPAにサインインしたままで、インスタンスを変更できるようにしたいと考えています。
マルチテナント/マルチデータベースのセキュリティ保護に関する情報を見ましたREST apiのですが、役割は一貫しているように見えるため、さまざまな役割を持つ1つのデータベースへの処理を推定することはできません。
だからこれらは私の質問です:
私はこれについて1〜2週間記事を探していましたが、自分の状況に最適なフローのタイプと、インスタンス間の変動をどのように処理するかを明確にするのに役立つものは見つかりませんでした。見逃した記事がある場合は、コメントとして追加してください。レビューも行います。
私はプログラマではありませんが、同様のことをしていると思われる組織をレビューしました。ここに彼らがそれをする方法があります...
AngularJSクライアントは、OAuthを介して持っているアプリケーションセキュリティAPIで認証します。次に、APIをホストするシステムが認証を渡し、2番目のシステムに許可を要求します。 2番目のシステムは、authZトークン、ユーザー名、およびクレームをセキュリティAPIシステムに返します。セキュリティAPIは、JWTを作成してセキュリティAPIシステムに返すトークンマネージャーシステムを呼び出します。最後に、セキュリティAPIはエンコードされたJWTをAngularJSクライアントに返します。
個別の呼び出しは、AngularJSクライアントから実際のアプリケーションAPIに渡され、トークンを提供します。アプリケーションAPIシステムは、検証のためにトークンをトークンマネージャーに渡します。有効な場合、APIはデータを返します(または無効なトークンや期限切れのトークンをスローします)。
更新の場合、AngularJSクライアントは再度セキュリティAPIにアクセスし、authZトークンシステムにアクセスして、更新されたトークンをセキュリティAPIシステムに返します。これにより、トークンがトークンマネージャーに送信され、新しいJWTが作成されて、セキュリティAPIがクライアント。
テナントの変更時に、セキュリティAPIへのauthZトークン転送要求の呼び出しを行い、authZトークンサーバーに到達すると、新しいauthZトークンが作成され、ユーザー名とロールと共にセキュリティAPIに送り返されます。 JWTとそれが返されたら、それをクライアントに渡します。
質問に直接回答するには...