web-dev-qa-db-ja.com

Keycloakは、カスタムプロトコルマッパーを使用して、データベース/外部ソースから追​​加のクレームを追加します

私はこの質問の解決策を与えるこれらの2つの投稿を見ましたが、これらは非Java私のような開発者:

Keycloakはデータベース/外部ソースから追​​加のクレームを追加します

KeycloakにカスタムProtocolMapperを登録する方法

以下は、詳細を入力すると他の人を助けることができる彼らのソリューションの要約です。

予想されるプロセス最初のリンクから

  1. ユーザーがログイン
  2. カスタムプロトコルマッパーが呼び出され、transformAccessTokenメソッドを上書きします
  3. ここでは、プロトコルマッパーが置かれているクライアントにサービスとしてログインします。ここでは、プロトコルマッパーを作成しているクライアントIDの代わりに別のクライアントIDを使用することを忘れないでください。それ以外の場合は、無限の再帰を入力します。
  4. アクセストークンをプロトコルマッパーに入れ、アプリケーションの残りのエンドポイントを呼び出して、保護されている追加のクレームを取得します。
  5. エンドポイントから返された情報を取得し、追加のクレームとして追加します

それを達成するための手順2番目のリンクから

ProtocolMapperインターフェースを実装し、クラスへの参照を含むファイル "META-INF/services/org.keycloak.protocol.ProtocolMapper"を追加します。

この時点で、Keycloakは新しい実装を認識します。また、管理コンソールから設定できるはずです。

トークンにデータを追加するには、次のインターフェースを追加します

org.keycloak.protocol.oidc.mappers.OIDCAccessTokenMapper

そして、インターフェースに従ってメソッドを実装します

次に、「META-INF/jboss-deployment-structure.xml」ファイルを次の内容で追加します

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <module name="org.keycloak.keycloak-services"/>
        </dependencies>
    </deployment>
</jboss-deployment-structure>

これをすべて実行した後、カスタムのtransformAccessToken()メソッドが、URL http://:/ auth/realms/testrealm/protocol/openid-connect/tokenへのリクエストごとに呼び出されます。

これを読んだ後、いくつか質問があります。

  1. 「ProtocolMapperを実装する」方法
  2. 前述のファイルをどこに追加しますか? (私のKeycloakインストールフォルダーにMETA-INF /ディレクトリが表示されません)
  3. 「次のインターフェイスを追加する」方法と場所
  4. カスタムのtransformAccessToken()はどのように見えますか

いつもありがとうございました。私が彼らの答えの要約を逃した場合は知らせてください。

編集:

私は、誰かがKeycloak 3.4.3のデータベースから追​​加のクレームを追加する方法の詳細な手順を教えてくれることを期待して、賞金を始めています(Java dev以外の場合に十分な詳細

編集2ここで説明されているメソッドは、トリックを実行できますが、詳細がありません。 KeycloakはカスタムIDプロバイダーマッパーを作成します

9
AlaricB

このステップバイステップガイドがお役に立てば幸いです

私はKeycloak 4.5.0を使用しています-この新しいバージョンがインストールされているためですが、大きな違いはありません。そして、私はOIDCProtocolMapperを例に実装しました。

それを要約するために-他の人のための簡単な概要のために-各ステップは後でより詳細に説明されています

  1. AbstractOIDCProtocolMapperに基づいてCustomProtocolMapperクラスを実装します

  2. META-INF/services org.keycloak.protocol.ProtocolMapperという名前のファイルが使用可能でなければならず、マッパーの名前が含まれています

  3. jboss-deployment-structure.xml組み込みクラスのキークロークを使用できるようにする必要があります

  4. JARファイルは/opt/jboss/keycloak/standalone/deployments/にデプロイされます

さて、今より多くの詳細:-)

カスタムマッパーを作成する

私はあなたのmavenをアップロードしましたpom.xmlpom )-IDEにインポートするだけで、すべての依存関係が自動的にロードされます。依存関係はprovided、後で実行時に直接キークロークから使用されます

関連するのはkeycloak.versionプロパティです。現在、すべてのキークロークの依存関係がバージョン4.5.0.Finalに読み込まれています

次に、CustomOIDCProtocolMapperというカスタムプロトコルマッパークラスを作成しました。 「完全な」コードを見つける ここ

AbstractOIDCProtocolMapperを拡張し、すべての抽象メソッドを実装する必要があります。 SAMLプロトコルマッパーが必要な場合は、それが別の基本クラス(AbstractSAMLProtocolMapper)になります。

関連するメソッドの1つはtransformAccessTokenです。ここでは、AccessTokenに追加のクレームを設定しています。ここにはロジックが必要ですが、そうです-データベースなどによって異なります;-)

サービスファイル

Keycloakがカスタム実装を見つけるには、サービスファイルは重要です

fileNameorg.keycloak.protocol.ProtocolMapperを使用してファイルを\src\main\resources\META-INF\services\内に配置します

このファイル内で、カスタムプロバイダーの名前に書き込みます。そのため、キークロークは、このクラスがプロトコルマッパーとして利用可能であることを認識します。
私の例では、ファイルの内容は1行だけです

com.stackoverflow.keycloak.custom.CustomOIDCProtocolMapper

デプロイメント構造XML

カスタムマッパーでは、キークロークのファイルを使用します。それらを使用するには、jbossにこの依存関係を通知する必要があります。したがって、jboss-deployment-structure.xml内にファイル\src\main\resources\META-INF\を作成します。コンテンツ:

<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <module name="org.keycloak.keycloak-services" />
        </dependencies>
    </deployment>
</jboss-deployment-structure>

拡張機能をビルドしてデプロイする

拡張機能のjarファイル(mvn clean package)をビルドし、jar/opt/jboss/keycloak/standalone/deployments/に配置して、キークロークを再起動します

ログファイルには、いつ展開されたか、そして(できれば)エラーメッセージが表示されるはずです。

これでマッパーを使用できます-この例では、keycloak admin uiでマッパーを作成し、ドロップダウンからStackoverflow Custom Protocol Mapperを選択できます

情報と同じように-これはkeycloakで完全に公式にサポートされているわけではありません-それで、インターフェイスは後のバージョンで変更される可能性があります

私はそれが理解可能であり、あなた自身のマッパーをうまく実装できるようになることを願っています

編集:エクスポートされたEclipseファイル構造 Zip

11
Evil_skunk