web-dev-qa-db-ja.com

Keycloakを使用した「APIキー」の発行

私のセットアップには3つのコンポーネントがあります。

  • バックエンドアプリケーション(Python/Flask)
  • フロントエンドアプリケーション(VueJS)
  • キークローク

フロントエンドはKeycloakを使用して、ユーザーがサインインし、アクセストークンを使用してバックエンドへのリクエストを認証できるようにします。ここまでは順調ですね。

今、私はサードパーティのアプリケーションがバックエンドに対して認証されたリクエストを行えるようにしたいのですが、Keycloakを使用してそれをどのように実現できるのでしょうか?私の考えは、顧客ごとに新しい資格情報を発行することです。その後、アプリケーションはKeycloakと通信してアクセストークンを取得します。その後、Keycloakを使用して、APIのすべてのユーザーのアクセス制御を管理できます。

  • Keycloak-クライアントでサードパーティのアプリはどのように表示されますか?ユーザー? ...?
  • この種のユースケースにはベストプラクティスがありますか?
10
Marco Lamina

最終的に、うまく機能し、外部アプリケーションに資格情報を発行するための「キークローク方法」であると思われるソリューションを見つけました。資格情報の新しいセットを作成するには、新しいKeycloakクライアントを追加し、次の設定を変更します。

  • 有効な標準フロー:[〜#〜] off [〜#〜]
  • 直接アクセス許可が有効:[〜#〜] off [〜#〜]
  • アクセスタイプ:Confidential
  • 有効なサービスアカウント:[〜#〜] on [〜#〜]

外部アプリケーションは、新しく作成されたクライアントの名前をclient_idとして使用します。 client_secretは自動的に生成され、Credentialsタブにあります。

サービスへのクライアントアクセスの許可

Keycloakで保護されたサービスが着信ベアラートークンのaudクレームをチェックするように構成されている場合、2番目のステップが必要です。デフォルトでは、Keycloakがクライアントに発行するJWTトークンの対象者はクライアントの名前に設定されるため、サービスによって拒否されます。 Client Scopes を使用して、その動作を変更できます。

  1. 新しいクライアントスコープを作成する
  2. 「オーディエンステンプレート」を選択します
  3. 外部アプリケーションへのアクセスを許可するサービスを選択し、「次へ」をクリックします
  4. 作成したクライアントにスコープを追加します(Client Scopes tab)

Keycloakは、新しいクライアントに発行するすべてのJWTトークンのaudクレームにサービスの名前を追加します。詳細については、 サービスアカウント のKeycloakのドキュメントをご覧ください。

アクセストークンのクライアント資格情報の交換

外部アプリケーションは、その資格情報を使用して、Keycloakのトークンエンドポイントからアクセストークンを取得できるようになりました。

POST {keycloak-url}/auth/realms/atlas/protocol/openid-connect/token

  • Content-Typeヘッダーをapplication/x-www-form-urlencodedに設定します
  • 基本認証を使用してリクエストを認証します。ユーザーとしてclient idを使用し、パスワードとしてクライアントシークレット
  • リクエスト本文にgrant_type=client_credentialsを設定します
13
Marco Lamina