LoginSignup
18
4

More than 3 years have passed since last update.

keycloakのServer Metadataの変遷

Last updated at Posted at 2018-12-07

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なトークンにする方法を記したものです。

18
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
4