Contenu connexe
Similaire à Keycloak開発入門 (20)
Plus de Yuichi Nakamura (8)
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. まとめ
- 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
クライアントから送信された
パラメータが転送されない
- 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なども使えるように!
- 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の指定)を参考に記載
– あまり理解しないでも書けてしまった…
- 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
- 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 ならびにその子会社の登録商標です。
• その他記載の会社名、製品名などは、それぞれの会社の商標もしくは登録商標です