Edited at

keycloakのServer Metadataの変遷


keycloakのServer Metadataの変遷


はじめに

日立製作所の乗松隆志と申します。keycloakのServer Metadataの変遷について記します。

Notes: 本投稿の内容は、公開情報を元に独自に解釈したものです。


Server Metadata

Server Metadataとして記載されるクレームは、RFCなど標準仕様で規定のあるものと、製品独自のものがあると考えます。

標準仕様で規定のあるものについて、大きくは2つに分けられると考えます。


  • OAuth 2.0の認可サーバーとしてのServer Metadata

  • OpenID ConnectのOpenID ProviderとしてのServer Metadata

keycloakのServer Metadataは、.well-known url(.well-known/openid-configuration)から取得します。

Server Metadataには、その製品がサポートしている機能などが記載されますが、それが全てではないことにご注意ください。


1.9.8.Final

2016/6/13にリリースされました。

{

"issuer":"http://localhost:8080/auth/realms/master",
"authorization_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/auth",
"token_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token",
"token_introspection_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token/introspect",
"userinfo_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/userinfo",
"end_session_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/logout",
"jwks_uri":"http://localhost:8080/auth/realms/master/protocol/openid-connect/certs",
"grant_types_supported":["authorization_code","implicit","refresh_token","password","client_credentials"],
"response_types_supported":["code","none","id_token","token","id_token token","code id_token","code token","code id_token token"],
"subject_types_supported":["public"],
"id_token_signing_alg_values_supported":["RS256"],
"response_modes_supported":["query","fragment","form_post"],
"registration_endpoint":"http://localhost:8080/auth/realms/master/clients-registrations/openid-connect"
}

13クレームあります。

#
クレーム名
参照元
説明

1
"issuer"
参照文献[2]
keycloakの識別子です。

2
"authorization_endpoint"
参照文献[2]
認可エンドポイントのURLです。

3
"token_endpoint"
参照文献[2]
トークンエンドポイントのURLです。

4
"token_introspection_endpoint"
なし
トークンイントロスペクションエンドポイントのURLのようですが、
参照文献[2]で定義されているクレーム名(“introspection_endpoint")と異なっています。

5
"userinfo_endpoint"
参照文献[3]
UserInfoエンポイントのURLです。

6
"end_session_endpoint"
参照文献[4]
エンドユーザーのログアウト用エンドポイントのURLです。

7
"jwks_uri"
参照文献[2]
keycloakが提供するJWK Set(鍵情報)の取得用エンドポイントのURLです。

8
"grant_types_supported"
参照文献[2]
keycloakがサポートしているOAuth 2.0のGrant Typeのリストです。

9
"response_types_supported"
参照文献[2]
keycloakがサポートしているOAuth 2.0の”response_type”の値のリストです。

10
"subject_types_supported"
参照文献[3]
keycloakがサポートしているSubject Identifierの種別のリストです。

11
"id_token_signing_alg_values_supported"
参照文献[3]
keycloakがサポートしている、IDトークンに対するJWSによる署名アルゴリズムのリストです。

12
"response_modes_supported"
参照文献[2]
keycloakがサポートしているOAuth 2.0の”response_mode”の値のリストです。

13
"registration_endpoint"
参照文献[2]
keycloakにクライアントを登録するために使用される
OAuth 2.0 Dynamic Client Registration EndpointのURLです。


2.5.5.Final

2017/3/15にリリースされました。

{

"issuer":"http://localhost:8080/auth/realms/master",
"authorization_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/auth",
"token_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token",
"token_introspection_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token/introspect",
"userinfo_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/userinfo",
"end_session_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/logout",
"jwks_uri":"http://localhost:8080/auth/realms/master/protocol/openid-connect/certs",
"check_session_iframe":"http://localhost:8080/auth/realms/master/protocol/openid-connect/login-status-iframe.html",
"grant_types_supported":["authorization_code","implicit","refresh_token","password","client_credentials"],
"response_types_supported":["code","none","id_token","token","id_token token","code id_token","code token","code id_token token"],
"subject_types_supported":["public","pairwise"],
"id_token_signing_alg_values_supported":["RS256"],
"userinfo_signing_alg_values_supported":["RS256"],
"request_object_signing_alg_values_supported":["none","RS256"],
"response_modes_supported":["query","fragment","form_post"],
"registration_endpoint":"http://localhost:8080/auth/realms/master/clients-registrations/openid-connect",
"token_endpoint_auth_methods_supported":["private_key_jwt","client_secret_basic","client_secret_post"],
"token_endpoint_auth_signing_alg_values_supported":["RS256"],
"claims_supported":["sub","iss","auth_time","name","given_name","family_name","preferred_username","email"],
"claim_types_supported":["normal"],
"claims_parameter_supported":false,
"scopes_supported":["openid","offline_access"],
"request_parameter_supported":true,
"request_uri_parameter_supported":true
}

以下11クレームが追加され、計24クレームとなりました。

#
クレーム名
参照元
説明

1
"check_session_iframe"
参照文献[4]
RP(Relying Party)がOP(OpenID Provider)とエンドユーザーのセッション情報の通信を行う際に使用するエンドポイントのURLです。
keycloakがOPにあたり、クライアントがRPにあたります。

2
"userinfo_signing_alg_values_supported"
参照文献[3]
UserInfoエンドポイントからの応答データに対するJWSによる署名アルゴリズムについて、
keycloakがサポートしているもののリストです。

3
"request_object_signing_alg_values_supported"
参照文献[3]
リクエストオブジェクトに対するJWSによる署名アルゴリズムについて、
keycloakがサポートしているもののリストです。

4
"token_endpoint_auth_methods_supported"
参照文献[2]
keycloakのトークンエンドポイントがサポートしている、クライアントの認証方式のリストです。

5
"token_endpoint_auth_signing_alg_values_supported"
参照文献[2]
keycloakトークンエンドポイントがサポートするクライアントの認証方式のうち、
JWTへのJWSによる署名を使用する方式である"private_key_jwt"と"client_secret_jwt"について、
認可サーバーがサポートする署名アルゴリズムのリストです。

6
"claims_supported"
参照文献[3]
keycloakがサポートしているクレームの名前のリストです(これらが全てであるというわけではありません)。

7
"claim_types_supported"
参照文献[3]
サポートしているクレームの種別です。

8
"claims_parameter_supported"
参照文献[3]
認可要求時のクエリパラメータとして、keycloakがclaimsをサポートするかどうかを真偽値で示すものです。

9
"scopes_supported"
参照文献[2]
サポートしているスコープのリストです(これらが全てであるというわけではありません)。

10
"request_parameter_supported"
参照文献[3]
認可要求時のクエリパラメータとして、keycloakがrequestをサポートするかどうかを真偽値で示すものです。
リクエストオブジェクトのサポートに関連します。

11
"request_uri_parameter_supported"
参照文献[3]
認可要求時のクエリパラメータとして、keycloakがrequest_uriをサポートするかどうかを真偽値で示すものです。
リクエストオブジェクトのサポートに関連します。

以下1クレームで、値の追加がありました。

#
クレーム名
参照元
説明

1
"subject_types_supported"
参照文献[3]
keycloakがサポートしているSubject Identifierの種別のリストです。
1.9.8.Finalでは、normalのみでしたが、2.5.5.Finalでは、pairwiseが追加されました。

1.9.8.Finalからの変更点をかいつまんで言うと、以下のようになります。


  • [OIDC] UserInfoエンドポイントからの応答データについて、JWAで規定されるRS256による署名のサポートを明示するようになりました。

  • [OIDC] リクエストオブジェクトに施される署名について、JWAで規定されるnoneとRS256のサポートを明示するようになりました。

  • [OIDC] トークンエンドポイントでのクライアントの認証方式として、OpenID Connect 1.0で規定される、"private_key_jwt","client_secret_basic","client_secret_post"のサポートを明示するようになりました。

  • [OIDC] requestおよびrequest_uriクエリパラメータによるリクエストオブジェクトのサポートを明示するようになりました。

  • [OIDC] Subject Identifierについて、pairwiseのサポートを明示するようになりました。


3.4.3.Final

2018/1/4にリリースされました。

2.5.5.Finalとかわらずです。


4.5.0.Final

2018/9/26にリリースされました。

{

"issuer":"http://localhost:8080/auth/realms/master",
"authorization_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/auth",
"token_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token",
"token_introspection_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token/introspect",
"userinfo_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/userinfo",
"end_session_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/logout",
"jwks_uri":"http://localhost:8080/auth/realms/master/protocol/openid-connect/certs",
"check_session_iframe":"http://localhost:8080/auth/realms/master/protocol/openid-connect/login-status-iframe.html",
"grant_types_supported":["authorization_code","implicit","refresh_token","password","client_credentials"],
"response_types_supported":["code","none","id_token","token","id_token token","code id_token","code token","code id_token token"],
"subject_types_supported":["public","pairwise"],
"id_token_signing_alg_values_supported":["ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","RS512"],
"userinfo_signing_alg_values_supported":["ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","RS512","none"],
"request_object_signing_alg_values_supported":["none","RS256"],
"response_modes_supported":["query","fragment","form_post"],
"registration_endpoint":"http://localhost:8080/auth/realms/master/clients-registrations/openid-connect",
"token_endpoint_auth_methods_supported":["private_key_jwt","client_secret_basic","client_secret_post","client_secret_jwt"],
"token_endpoint_auth_signing_alg_values_supported":["RS256"],
"claims_supported":["sub","iss","auth_time","name","given_name","family_name","preferred_username","email"],
"claim_types_supported":["normal"],
"claims_parameter_supported":false,
"scopes_supported":["openid","address","email","offline_access","phone","profile"],
"request_parameter_supported":true,
"request_uri_parameter_supported":true,
"code_challenge_methods_supported":["plain","S256"],
"tls_client_certificate_bound_access_tokens":true,
"introspection_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token/introspect"
}

以下3クレームが追加され、計27クレームとなりました。

#
クレーム名
参照元
説明

1
"code_challenge_methods_supported"
参照文献[2]
RFC 7636 Proof Key for Code Exchange (PKCE)で定義されているcode challengeの方式のうち、
keycloakがサポートしているもののリストです。

2
"tls_client_certificate_bound_access_tokens"
参照文献[5]
TLSにおける証明書を使用したクライアント認証を利用して、アクセストークンをHolder-of-Keyなトークンとする
機能をサポートしているかどうかを真偽値で示すものです。

3
"introspection_endpoint"
参照文献[2]
トークンイントロスペクションエンドポイントのURLです。
”token_introspection_endpoint”として1.9.8.Finalのころからあったものの、クレーム名が間違っていた模様です。

以下4クレームで、値の追加がありました。

#
クレーム名
参照元
説明

1
"id_token_signing_alg_values_supported"
参照文献[3]
keycloakがサポートしている、IDトークンに対するJWSによる署名アルゴリズムのリストです。これまでは“RS256”のみのサポートでしたが、
新たに”RS384”、”RS512”、”ES256”、”ES384”、”ES512”、”HS256”、”HS384”、”HS512”がサポートされるようになりました。

2
"userinfo_signing_alg_values_supported"
参照文献[3]
UserInfoエンドポイントからの応答データに対するJWSによる署名アルゴリズムについて、keycloakがサポートしているもののリストです。
これまでは“RS256”のみのサポートでしたが、新たに”RS384”、”RS512”、”ES256”、”ES384”、”ES512”、”HS256”、”HS384”、”HS512”、”none”
がサポートされるようになりました。

3
"token_endpoint_auth_methods_supported"
参照文献[2]
keycloakのトークンエンドポイントがサポートしている、クライアントの認証方式のリストです。
これまで"private_key_jwt","client_secret_basic","client_secret_post"がサポートされていましたが、
新たに"client_secret_jwt"がサポートされるようになりました。

4
"scopes_supported"
参照文献[2]
サポートしているスコープのリストです(これらが全てであるというわけではありません)。
これまでは"openid","offline_access"がサポートされていましたが、
新たに"address","email","phone","profile"がサポートされるようになりました。

3.4.3.Finalからの変更点をかいつまんで言うと、以下のようになります。


  • [OAuth 2.0] PKCEをサポートし、方式として、"plain"と"S256"に対応できるようになりました。

  • [OAuth 2.0] TLSにおける証明書を使用したクライアント認証を利用して、アクセストークンをHolder-of-Keyなトークンとする機能をサポートするようになりました。

  • [OAuth 2.0] トークンイントロスペクションのURLについて、クレーム名が間違っていたようなので、正しいクレーム名で追加されました。

  • [OIDC] IDトークンの署名アルゴリズムとして、"ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","RS512"もサポートできるようになりました。(もともとはRS256のみ)

  • [OIDC] UserInfoエンドポイントの応答に入れる署名アルゴリズムとして、"ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","RS512","none"もサポートできるようになりました。(もともとはRS256のみ)

  • [OIDC] トークンエンドポイントでのクライアント認証方法として、"private_key_jwt","client_secret_basic","client_secret_post","client_secret_jwt"の4つをサポートできるようになりました。("client_secret_jwt"が加わった)


参照文献

[1] OAuth Parameters

IANAのRegistryに登録済みの、OAuth 2.0に関する各種パラメータの一覧です。

[2] OAuth 2.0 Authorization Server Metadata

OAuth 2.0の認可サーバーのメタデータの定義です。

[3] OpenID Connect Discovery 1.0 - 3. OpenID Provider Metadata

OpenID Providerのメタデータの定義です。

[4] OpenID Connect Session Management 1.0

OIDCのセッションの管理に関する、OpenID Providerのメタデータの定義です。

[5] OAuth 2.0 Mutual TLS Client Authentication and Certificate Bound Access Tokens

TLSにおける証明書を使用したクライアント認証を利用して、アクセストークンをHolder-of-Keyなトークンにする方法を記したものです。