Keycloak の SAML NameID Mapper について
KeycloakのMapperについて
KeycloakにはOpenID ConnectのIDトークンやSAMLのAttributeに任意の属性を追加できるようにするためのMapperの設定があります。
KeycloakのNameID Mapperについて
KeycloakにはBuiltInでNameID Mapperがなかったので、
KeycloakのNameIDに設定される値は以下のように固定となっていました。
Name ID Format | Properties/Attributes Used | Example |
---|---|---|
username (unspecified) | Username Property | example_user |
Email Property | example_user@example.com | |
persistent | saml.persistent.name.id.for.$clientId Attribute | G-6e2a1050-0fc0-479b-bf6e-29cd3ccb373b |
transient | property and attribute values are not used | G-bfb85c10-57d7-4331-81bc-52f104599d79 |
記載のPropertyやAttribute以外の値に変更したい場合は、Keycloakに追加機能の開発が必要になってしまうので、Keycloakのセキュリティ管理コンソールから、NameIDの値についても変更ができるようにNameID MapperをBuiltInとして使えるようにしてみました。
Keycloak 13.0 より、NameID Mapperが利用できるようになっています。
KeycloakのNameID Mapperの使い方について
Mapperのマッパータイプに User Attribute Mapper For NameID
というマッパーが追加されているので、これを使います。 ユーザー属性の項目にはNameIDの値として利用したいユーザーの属性名を指定します。
①NameID Mapperの設定がない場合は、
urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified には
ユーザーのuserNameの値が設定されます。
②図のようにNameID Mapperを設定することで
urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified には
ユーザーのemailの値が設定されます。
①の場合のSAML アサーションをデコードした一部
<saml:Subject>
<saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">example_user</saml:NameID>
<saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
<saml:SubjectConfirmationData NotOnOrAfter="2021-04-04T00:00:01.091Z" Recipient="https://sample.example.com" />
</saml:SubjectConfirmation>
</saml:Subject>
②の場合のSAML アサーションをデコードした一部
<saml:Subject>
<saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">example_user@example.com</saml:NameID>
<saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
<saml:SubjectConfirmationData NotOnOrAfter="2021-04-04T00:03:32.764Z" Recipient="https://sample.example.com" />
</saml:SubjectConfirmation>
</saml:Subject>
さいごに
KeycloakへのContributeの仕方についてはKeycloak 開発入門の記事がとても参考になりました。
KeycloakはPull Requestを出すときにIntegration Testの実装を求められます。そのときには以下のようにIntegration Testの内容を図に起こしてみるとわかりやすいと思います。
他のIntegration Testがどのように処理をしているのか図にしてみると、自分がIntegration Testの実装をどのようにしたらいいか整理ができた感じがします。以下は別のPull RequestのIntegration Testの画像です。
また、googlegroupsでも相談することでRedHatの方がコメントを早めにくれたことも助かりました。最終的にアドバイス頂いた内容での実装はしませんでしたが、実装を考える際の参考になるコメントを頂いたので、とても勉強になりました。
Keycloakはプロの方の意見を聞ける場が非常に多いので、Contributeを検討している方はkeycloak-devのgooglegroupsで相談してみるのも良いと思います。
Discussion