Keycloakサーバーを使用してSSOを実装しています。 client_credentialsフローを使用して、特定のクライアントのアクセストークンを取得できます。
ただし、私の観察では、アクセストークンはクライアントの内部サービスアカウントに付与されています。 追加のパラメーターをトークンエンドポイントに提供することにより、アクセストークン for 他のユーザーに存在するレルムを取得したい。
以下は現在のリクエスト私がトークンエンドポイントを使用してPostman Chrome拡張:
POST http://localhost:8080/auth/realms/<realm>/protocol/<protocol>/token
x-www-form-urlencoded
grant_type client_credentials
client_id <client_id>
client_secret <client_secret>
可能であれば教えてください。また、Keycloakおよびopenid-connectプロトコルにまったく新しいことを伝えたいと思います。
ここでいくつかのOauthの概念を誤解していると思います。client_credentials許可は、特定のアクセスを許可するサービス自体にのみ使用する必要があります。リソース。このシナリオを想像してみてください。
エンドユーザー->ドキュメントサービス->ドキュメントリポジトリ
エンドユーザーは、ドキュメントサービスを介してリポジトリに保存されている一部のドキュメントにアクセスできます。この場合、リポジトリは単なるコンテンツサーバーであるため、サービスはユーザーに特定のドキュメントへのアクセスを許可するかどうかを決定します。明らかに、それらは両方とも2つの異なるkeycloakクライアントを介して保護されています。
ただし、ドキュメントサービスにはリポジトリへのフルアクセスが必要です。彼は要求したすべてのドキュメントにアクセスできます。解決策は、ドキュメントサービスにサービスアカウントロール、たとえばDOC_MANAGERを与え、リソースが要求されたときにこのロールのレポチェックを行うことです。サービスはclient_credentialsで認証され、リソースへのアクセスを取得しますサービスとして。
ただし、エンドユーザーは、たとえば 認証コードフロー を使用して標準ログインを実行し、サービスを介してドキュメントにアクセスします。サービスは、リポジトリに移動する前に、別のロール、たとえばDOC_USERをチェックし、ユーザーがこの具体的なリソースにアクセスできるかどうかをチェックします。
Keycloakサービスアカウントの詳細を読むことができます ここ 。