Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
© Hitachi, Ltd. 2018. All rights reserved.
Keycloakパッチ開発事例紹介
株式会社 日立製作所
茂木 昂士
2018/07/13
© Hitachi, Ltd. 2018. All rights reserved.
1. 何を実装したか
2. 開発の準備
3. 実装
Contents
1
4. コードレビュー
5. まとめ
© Hitachi, Ltd. 2018. All rights reserved.
1. 何を実装したか?
2
© Hitachi, Ltd. 2018. All rights reserved.
Contributeしたきっかけ
3
• 認証の画面も含めて独自のものにしたかった
– ロジックが入るため、Theme機能では足りない
– OpenID Connectで規定されていない独自パラメータも利用したい
• Keycloakをカスタマイズして対応
– SPIという仕組みがありカスタマイズは可能
– Identity BrokerのSPIを利用して要求を実現
• カスタマイズしたもののアップデートが必要
– コミュニティに管理してもらおう!
© Hitachi, Ltd. 2018. All rights reserved.
Identity Brokering
4
• 認証を外部のIdPに委譲する機能
– 認証して得られた結果(ID Token)をKeycloakのユーザとして扱う
• 追加した機能
– 認証時に独自のパラメータが転送されるようにした
外部IdPに認証してもらう
認証済みユーザ情報を
Keycloakのユーザとして扱う
Keycloakで認証
Keycloakでユーザ管理
© Hitachi, Ltd. 2018. All rights reserved.
Flow
5
クライアントから送信された
パラメータが転送されない
© Hitachi, Ltd. 2018. All rights reserved.
2. 開発の準備
6
© Hitachi, Ltd. 2018. All rights reserved.
前準備
7
• 詳細は「Hacking on Keycloak」を
• 下記のコミュニケーションツールがある
– GitHub
– JIRA (JBoss Developer)
– メーリングリスト
• JIRAでチケット作成 -> 新規 Pull Request
© Hitachi, Ltd. 2018. All rights reserved.
ソース取得・ビルド
8
• ForkしてClone
– git clone https://github.com/<your_name>/keycloak
• Mavenでビルド
– mvn install –DskipTests=true
– cd distribution
– mvn install
• distribution/targets以下に出力される
• テストはよく失敗するのでとりあえず飛ばす
– ごめんなさい…
© Hitachi, Ltd. 2018. All rights reserved.
IDE(Eclipse)での開発
9
• Mavenプロジェクトをインポート
– Test, Example含め300以上のプロジェクトがある
– 最初のインポートは時間がかかる
– プロジェクトは階層表示を推奨
• Code FormatはWildflyのものを利用
– https://developer.jboss.org/wiki/ImportFormattingRules
– すべてのコードに適用されているかは…
© Hitachi, Ltd. 2018. All rights reserved.
IDEでのデバッグ
10
• 公式には下記コマンドでサーバを起動している
– mvn -f testsuite/utils/pom.xml exec:java -Pkeycloak-server
(From README.md)
• せっかくなのでIDEでデバッグ
– 上記pom.xmlを見ると、下記のクラスを実行している
– Project: keycloak-testsuite-utils
– Main : org.keycloak.testsuite.KeycloakServer
Break Pointなども使えるように!
© Hitachi, Ltd. 2018. All rights reserved.
3. 実装
11
© Hitachi, Ltd. 2018. All rights reserved.
Walkthrough
12
• 関係するクラスを探っていく
– 基本的な機能はkeycloak-servicesにある
セッション作成
パラメータ保存
外部IdPへ保存した
パラメータ転送
ブラウザ Keycloak 外部IdP
© Hitachi, Ltd. 2018. All rights reserved.
AuthorizationEndpoint
13
• Keycloakログイン画面の表示
– QueryParameterのパース、チェックなど
– Sessionの作成、保存
• AuthorizationSessionというInfinispanモデルを作成
• QueryParameterなどもこれに保管されている
• 独自パラメータもすでに保管されている
– ClientNotesというMapにパラメータが入っている
– Standardなパラメータと区別するためPrefixつき
© Hitachi, Ltd. 2018. All rights reserved.
IdentityBrokerService
14
• 登録されているIdPを選択、Provider実行
– “/{provider_id}/login”というパス定義
– 外部IdPへのリダイレクトをキック
ここのリンク先になる
© Hitachi, Ltd. 2018. All rights reserved.
OidcIdentityProvider
15
• SPI(keycloak-spi-private)を実装している
– Provider, ProviderFactory, ProviderConfigの組み合わせ
• 今回はAbstractOauth2IdentityProviderを変更
– OidcIdentityProviderの親クラス
– createAuthorizationUrlメソッドでRedirect先を生成
© Hitachi, Ltd. 2018. All rights reserved.
設定項目の追加(1/2)
16
• 設定項目の追加が必要
– 特定のパラメータだけ転送するようにするため
– 設定項目保存のための修正が必要
• Identity Brokeringの設定項目はDBに入っている
DBスキーマの変更面倒そうだなぁ…
© Hitachi, Ltd. 2018. All rights reserved.
設定項目の追加(2/2)
17
MariaDB [rhsso]> select * from IDENTITY_PROVIDER_CONFIG;
+--------------------------------------+----------------------------------+----------------------+
| IDENTITY_PROVIDER_ID | VALUE | NAME |
+--------------------------------------+----------------------------------+----------------------+
| edcd71e3-2210-401c-afb8-d36f479e8493 | http://keycloak.../auth | authorizationUrl |
| edcd71e3-2210-401c-afb8-d36f479e8493 | | backchannelSupported |
| edcd71e3-2210-401c-afb8-d36f479e8493 | keycloak | clientId |
| edcd71e3-2210-401c-afb8-d36f479e8493 | 0882f656 | clientSecret |
| edcd71e3-2210-401c-afb8-d36f479e8493 | | disableUserInfo |
| edcd71e3-2210-401c-afb8-d36f479e8493 | | hideOnLoginPage |
| edcd71e3-2210-401c-afb8-d36f479e8493 | http://keycloak... | issuer |
| edcd71e3-2210-401c-afb8-d36f479e8493 | http://keycloak.../certs | jwksUrl |
| edcd71e3-2210-401c-afb8-d36f479e8493 | | loginHint |
| edcd71e3-2210-401c-afb8-d36f479e8493 | http://keycloak.../logout | logoutUrl |
| edcd71e3-2210-401c-afb8-d36f479e8493 | http://keycloak.../token | tokenUrl |
| edcd71e3-2210-401c-afb8-d36f479e8493 | true | useJwksUrl |
| edcd71e3-2210-401c-afb8-d36f479e8493 | http://keycloak.../userinfo | userInfoUrl |
| edcd71e3-2210-401c-afb8-d36f479e8493 | true | validateSignature |
+--------------------------------------+----------------------------------+----------------------+
14 rows in set (0.00 sec)
• 設定項目はKey-Valueペアで保存されていた
– よく変更されるので合理的
必要な場合は keycloak-model-jpaというプロジェクトにまとまっている
© Hitachi, Ltd. 2018. All rights reserved.
GUIの変更
18
• keycloak-theme
– AngularJS(1.6.x)で作られている
– Formの追加だけでOKだった
– ラベル等はangular-translate
• keyclaok-previewというフォルダがあった
– Angular 5.x で作り直しているみたい
– レスポンシブ対応などのPull Requestを目にしている
© Hitachi, Ltd. 2018. All rights reserved.
テストコード(Integration)
19
• Arquillianというフレームワークを使っている
– JavaEEアプリケーションのテストを自動化してくれる
• テストの実行
– ブラウザを使うテストも実行可能(Selenium, PhantomJS etc.)
– mvn -f testsuite/integration-arquillian/tests/base/pom.xml test
– 正規表現等で実行するテストを指定できる
• -Dtest=“org.keycloak.testsuite.broker.Kc*” など
– 詳細は HOW-TO-RUN.md に
© Hitachi, Ltd. 2018. All rights reserved.
Identity Brokeringのテスト
20
• 外部IdPとの連携テストをどうやるか?
– KeycloakのRealmを2つ用意してやる
– ProviderとConsumerの設定をKeycloakに設定
• org.keycloak.testsuite.broker.KcOidcBrokerConfiguration
• パラメータの転送テスト
– すでにあるテスト(arc_values, promptの指定)を参考に記載
– あまり理解しないでも書けてしまった…
© Hitachi, Ltd. 2018. All rights reserved.
4. コードレビュー
21
© Hitachi, Ltd. 2018. All rights reserved.
GithubへPush
22
• コードをPushすると、TravisCIでテストが実行される
– 全テストが終わるのに20分くらいかかる
– すべてパスすれば、レビューしてもらえる
• Unit Testはあまり必要ない
– 「IntegrationとUnitで内容が重複するとメンテコストが上がる」
– Integration Testがしっかりしているので問題ない
• 最後にコミットをまとめる
– 1Pull Request に 1commitというポリシー
– git rebase -i, git push –f
© Hitachi, Ltd. 2018. All rights reserved.
5. まとめ
23
© Hitachi, Ltd. 2018. All rights reserved.
まとめ
24
• やりたいことを正しく伝える
– 理解してもらえないと的外れな指摘
– 「よしなに」はやってくれない
– Test Caseも伝えるための手段
• Time Zoneの違い
– 日本と時差のある国(ex: ヨーロッパ諸国)
– こっちの17時過ぎくらいから仕事が始まる
© Hitachi, Ltd. 2018. All rights reserved.
株式会社 日立製作所
Keycloakパッチ投稿事例紹介
2018/07/13
茂木 昂士
END
25
© Hitachi, Ltd. 2018. All rights reserved.
他社所有商標に関する表示
26
• Hitachiは株式会社 日立製作所の商標または登録商標です
• JBoss は米国 RedHat Inc ならびにその子会社の登録商標です。
• その他記載の会社名、製品名などは、それぞれの会社の商標もしくは登録商標です
Keycloak開発入門

More Related Content

Keycloak開発入門

  • 1. © Hitachi, Ltd. 2018. All rights reserved. Keycloakパッチ開発事例紹介 株式会社 日立製作所 茂木 昂士 2018/07/13
  • 2. © Hitachi, Ltd. 2018. All rights reserved. 1. 何を実装したか 2. 開発の準備 3. 実装 Contents 1 4. コードレビュー 5. まとめ
  • 3. © Hitachi, Ltd. 2018. All rights reserved. 1. 何を実装したか? 2
  • 4. © Hitachi, Ltd. 2018. All rights reserved. Contributeしたきっかけ 3 • 認証の画面も含めて独自のものにしたかった – ロジックが入るため、Theme機能では足りない – OpenID Connectで規定されていない独自パラメータも利用したい • Keycloakをカスタマイズして対応 – SPIという仕組みがありカスタマイズは可能 – Identity BrokerのSPIを利用して要求を実現 • カスタマイズしたもののアップデートが必要 – コミュニティに管理してもらおう!
  • 5. © Hitachi, Ltd. 2018. All rights reserved. Identity Brokering 4 • 認証を外部のIdPに委譲する機能 – 認証して得られた結果(ID Token)をKeycloakのユーザとして扱う • 追加した機能 – 認証時に独自のパラメータが転送されるようにした 外部IdPに認証してもらう 認証済みユーザ情報を Keycloakのユーザとして扱う Keycloakで認証 Keycloakでユーザ管理
  • 6. © Hitachi, Ltd. 2018. All rights reserved. Flow 5 クライアントから送信された パラメータが転送されない
  • 7. © Hitachi, Ltd. 2018. All rights reserved. 2. 開発の準備 6
  • 8. © Hitachi, Ltd. 2018. All rights reserved. 前準備 7 • 詳細は「Hacking on Keycloak」を • 下記のコミュニケーションツールがある – GitHub – JIRA (JBoss Developer) – メーリングリスト • JIRAでチケット作成 -> 新規 Pull Request
  • 9. © Hitachi, Ltd. 2018. All rights reserved. ソース取得・ビルド 8 • ForkしてClone – git clone https://github.com/<your_name>/keycloak • Mavenでビルド – mvn install –DskipTests=true – cd distribution – mvn install • distribution/targets以下に出力される • テストはよく失敗するのでとりあえず飛ばす – ごめんなさい…
  • 10. © Hitachi, Ltd. 2018. All rights reserved. IDE(Eclipse)での開発 9 • Mavenプロジェクトをインポート – Test, Example含め300以上のプロジェクトがある – 最初のインポートは時間がかかる – プロジェクトは階層表示を推奨 • Code FormatはWildflyのものを利用 – https://developer.jboss.org/wiki/ImportFormattingRules – すべてのコードに適用されているかは…
  • 11. © Hitachi, Ltd. 2018. All rights reserved. IDEでのデバッグ 10 • 公式には下記コマンドでサーバを起動している – mvn -f testsuite/utils/pom.xml exec:java -Pkeycloak-server (From README.md) • せっかくなのでIDEでデバッグ – 上記pom.xmlを見ると、下記のクラスを実行している – Project: keycloak-testsuite-utils – Main : org.keycloak.testsuite.KeycloakServer Break Pointなども使えるように!
  • 12. © Hitachi, Ltd. 2018. All rights reserved. 3. 実装 11
  • 13. © Hitachi, Ltd. 2018. All rights reserved. Walkthrough 12 • 関係するクラスを探っていく – 基本的な機能はkeycloak-servicesにある セッション作成 パラメータ保存 外部IdPへ保存した パラメータ転送 ブラウザ Keycloak 外部IdP
  • 14. © Hitachi, Ltd. 2018. All rights reserved. AuthorizationEndpoint 13 • Keycloakログイン画面の表示 – QueryParameterのパース、チェックなど – Sessionの作成、保存 • AuthorizationSessionというInfinispanモデルを作成 • QueryParameterなどもこれに保管されている • 独自パラメータもすでに保管されている – ClientNotesというMapにパラメータが入っている – Standardなパラメータと区別するためPrefixつき
  • 15. © Hitachi, Ltd. 2018. All rights reserved. IdentityBrokerService 14 • 登録されているIdPを選択、Provider実行 – “/{provider_id}/login”というパス定義 – 外部IdPへのリダイレクトをキック ここのリンク先になる
  • 16. © Hitachi, Ltd. 2018. All rights reserved. OidcIdentityProvider 15 • SPI(keycloak-spi-private)を実装している – Provider, ProviderFactory, ProviderConfigの組み合わせ • 今回はAbstractOauth2IdentityProviderを変更 – OidcIdentityProviderの親クラス – createAuthorizationUrlメソッドでRedirect先を生成
  • 17. © Hitachi, Ltd. 2018. All rights reserved. 設定項目の追加(1/2) 16 • 設定項目の追加が必要 – 特定のパラメータだけ転送するようにするため – 設定項目保存のための修正が必要 • Identity Brokeringの設定項目はDBに入っている DBスキーマの変更面倒そうだなぁ…
  • 18. © Hitachi, Ltd. 2018. All rights reserved. 設定項目の追加(2/2) 17 MariaDB [rhsso]> select * from IDENTITY_PROVIDER_CONFIG; +--------------------------------------+----------------------------------+----------------------+ | IDENTITY_PROVIDER_ID | VALUE | NAME | +--------------------------------------+----------------------------------+----------------------+ | edcd71e3-2210-401c-afb8-d36f479e8493 | http://keycloak.../auth | authorizationUrl | | edcd71e3-2210-401c-afb8-d36f479e8493 | | backchannelSupported | | edcd71e3-2210-401c-afb8-d36f479e8493 | keycloak | clientId | | edcd71e3-2210-401c-afb8-d36f479e8493 | 0882f656 | clientSecret | | edcd71e3-2210-401c-afb8-d36f479e8493 | | disableUserInfo | | edcd71e3-2210-401c-afb8-d36f479e8493 | | hideOnLoginPage | | edcd71e3-2210-401c-afb8-d36f479e8493 | http://keycloak... | issuer | | edcd71e3-2210-401c-afb8-d36f479e8493 | http://keycloak.../certs | jwksUrl | | edcd71e3-2210-401c-afb8-d36f479e8493 | | loginHint | | edcd71e3-2210-401c-afb8-d36f479e8493 | http://keycloak.../logout | logoutUrl | | edcd71e3-2210-401c-afb8-d36f479e8493 | http://keycloak.../token | tokenUrl | | edcd71e3-2210-401c-afb8-d36f479e8493 | true | useJwksUrl | | edcd71e3-2210-401c-afb8-d36f479e8493 | http://keycloak.../userinfo | userInfoUrl | | edcd71e3-2210-401c-afb8-d36f479e8493 | true | validateSignature | +--------------------------------------+----------------------------------+----------------------+ 14 rows in set (0.00 sec) • 設定項目はKey-Valueペアで保存されていた – よく変更されるので合理的 必要な場合は keycloak-model-jpaというプロジェクトにまとまっている
  • 19. © Hitachi, Ltd. 2018. All rights reserved. GUIの変更 18 • keycloak-theme – AngularJS(1.6.x)で作られている – Formの追加だけでOKだった – ラベル等はangular-translate • keyclaok-previewというフォルダがあった – Angular 5.x で作り直しているみたい – レスポンシブ対応などのPull Requestを目にしている
  • 20. © Hitachi, Ltd. 2018. All rights reserved. テストコード(Integration) 19 • Arquillianというフレームワークを使っている – JavaEEアプリケーションのテストを自動化してくれる • テストの実行 – ブラウザを使うテストも実行可能(Selenium, PhantomJS etc.) – mvn -f testsuite/integration-arquillian/tests/base/pom.xml test – 正規表現等で実行するテストを指定できる • -Dtest=“org.keycloak.testsuite.broker.Kc*” など – 詳細は HOW-TO-RUN.md に
  • 21. © Hitachi, Ltd. 2018. All rights reserved. Identity Brokeringのテスト 20 • 外部IdPとの連携テストをどうやるか? – KeycloakのRealmを2つ用意してやる – ProviderとConsumerの設定をKeycloakに設定 • org.keycloak.testsuite.broker.KcOidcBrokerConfiguration • パラメータの転送テスト – すでにあるテスト(arc_values, promptの指定)を参考に記載 – あまり理解しないでも書けてしまった…
  • 22. © Hitachi, Ltd. 2018. All rights reserved. 4. コードレビュー 21
  • 23. © Hitachi, Ltd. 2018. All rights reserved. GithubへPush 22 • コードをPushすると、TravisCIでテストが実行される – 全テストが終わるのに20分くらいかかる – すべてパスすれば、レビューしてもらえる • Unit Testはあまり必要ない – 「IntegrationとUnitで内容が重複するとメンテコストが上がる」 – Integration Testがしっかりしているので問題ない • 最後にコミットをまとめる – 1Pull Request に 1commitというポリシー – git rebase -i, git push –f
  • 24. © Hitachi, Ltd. 2018. All rights reserved. 5. まとめ 23
  • 25. © Hitachi, Ltd. 2018. All rights reserved. まとめ 24 • やりたいことを正しく伝える – 理解してもらえないと的外れな指摘 – 「よしなに」はやってくれない – Test Caseも伝えるための手段 • Time Zoneの違い – 日本と時差のある国(ex: ヨーロッパ諸国) – こっちの17時過ぎくらいから仕事が始まる
  • 26. © Hitachi, Ltd. 2018. All rights reserved. 株式会社 日立製作所 Keycloakパッチ投稿事例紹介 2018/07/13 茂木 昂士 END 25
  • 27. © Hitachi, Ltd. 2018. All rights reserved. 他社所有商標に関する表示 26 • Hitachiは株式会社 日立製作所の商標または登録商標です • JBoss は米国 RedHat Inc ならびにその子会社の登録商標です。 • その他記載の会社名、製品名などは、それぞれの会社の商標もしくは登録商標です