40 OpenIDConnectの理解
OpenIDConnectは、OAuth 2.0認可プロセスの拡張機能として認証を実装します。認可リクエストにopenidスコープ値を含めて、クライアントがこの拡張機能の使用をリクエストします。
ノート:
OpenIDConnectでは外部資格証明コレクタ(DCC)の使用がサポートされていません。「Access Manager資格証明コレクションの概要」も参照してください。OpenIDConnectはid_tokenの形でエンドユーザーに関する情報を提供します。このトークンでユーザーのアイデンティティを検証し、エンドユーザーに関する基本的なプロファイル情報を提供します。OpenIDConnectはOAM 12cBP01インストール・プロセス中にデフォルトで有効になります。
この節では、以下のトピックについて説明します。
関連項目:
40.1 OpenIDConnectトークンについて
OpenIDConnectではトークン(OpenIDConnect IDトークン)が生成されます。
OAuthのアクセス・トークンとリフレッシュ・トークンに加え、OpenIDConnectではアイデンティティ・トークン(IDトークン)が考慮されます。OAuth 2.0でエンドユーザーを認証するために、OpenIDConnectにより拡張されたのがIDトークンのデータ構造です。
参照
40.1.1 OpenIDConnectのIDトークン
IDトークンはセキュリティ・トークンです。クライアントを使用するときの認可サーバーによるエンドユーザー認証に関するクレーム(および場合によっては他のリクエストされたクレーム)が含まれます。
IDトークンのクレームにはサブジェクト、発行者、オーディエンスおよびタイムスタンプが含まれます。次の表に、OpenIDConnectで使用されるすべてのOAuth 2.0フローにおけるIDトークン内のクレームを示します。
表40-1 OpenIDConnectで使用されるIDトークン内のクレーム
フィールド | 説明 | タイプ | 必須/オプション |
---|---|---|---|
iss |
レスポンスの発行者の発行者識別子。 |
文字列 |
必須 |
sub |
サブジェクト識別子。 |
文字列 |
必須 |
aud |
このIDトークンの対象となるオーディエンス。 |
文字列 |
必須 |
exp |
有効期限。この時刻以降はIDトークンを処理のために受け入れることはできません。 |
文字列 |
必須 |
iat |
JWTが発行された時刻。 |
文字列 |
必須 |
auth_time |
エンドユーザーの認証が発生した時刻。 |
文字列 |
必須 |
Nonce |
クライアント・セッションとIDトークンの関連付け、およびリプレイ攻撃の軽減のための値。 |
文字列(大/小文字が区別される) |
必須 |
acr |
認証レベルの値。 |
文字列(大/小文字が区別される) |
オプション。 |
amr |
密接な関係がある認証方式のファミリの識別子。認証方式の参照値に関する項を参照。 |
文字列の配列(大/小文字が区別される) |
オプション。 |
azp |
アクセス・トークンを使用してリソースをリクエストする対象パーティの識別子。 |
文字列(大/小文字が区別される) |
オプション。 |
sid |
セッション識別子と詳細を含む暗号化されたトークンの値。 |
文字列(大/小文字が区別される) |
オプション。 |
ノート:
nonce値は変更されずに認証リクエストからIDトークンに渡されます。IDトークン内に存在する場合、nonceクレーム値が、認証リクエストで送信されるnonceパラメータ値と等しいことをクライアントで検証する必要があります。認証リクエストに存在する場合、認可サーバーはnonceクレームをIDトークンに含める必要があります。その際、クレーム値は認証リクエストで送信されるnonce値と同一の必要があります。認可サーバーは、使用されるnonce値に対してこれ以外の処理は実行できません。IDトークンのクレーム・セットのサンプル:
{ "iss": "http://host1:14100/oauth2", "sub": "weblogic", "aud": ["MDCClient19","http://host1:14100/oauth2"], "exp": 1509626702, "iat": 1509623102, "auth_time": "1509623099159", "jti": "_UC4Ew-NUTYQsMOXCoMo0g", "at_hash": "5CnkOBb_Mk28GYJlhC_Srg", "azp": "MDCClient19", "acr": "2", "sid": "gO5pDtJFt+7bH/YQC8QpUQ==~teJOlstvBcUXT8xXcmaIG1ppGMAmBLKqPuJUKnzLyX3spmDtWwgDm/qj5hhoyPhSiqAghOgFmE+kpsm8esEEsbZht+L5dkL27JUSUbAGBBmwlR/8QlxLTE0cEoNJ+9aJ", "amr": ["pwd"] }
40.2 クレーム
クライアントはエンドユーザーおよび認証イベントに関するクレームを取得します。標準的なクレームは、ユーザー情報レスポンスまたはIDトークンで返されるようリクエストできます。
次に、OpenIDConnectで使用される標準クレームの一部を示します。サポートされている標準クレームの完全なリストは、https://openid.net/specs/openid-connect-basic-1_0.html#StandardClaimsを参照してください
表40-2 OpenIDConnectで使用されるクレーム
フィールド | 説明 | タイプ | 必須/オプション |
---|---|---|---|
sub |
発行者におけるエンドユーザーの識別子。 |
string |
必須 |
name |
エンドユーザーの名前全体は表示可能な形式で、すべての名前部分(場合によっては役職と接尾辞)が含まれ、エンドユーザーのロケールとプリファレンスに従った順序になります。 |
string |
必須 |
given_name |
エンドユーザーの名。文化によって、複数の名がある場合はスペース文字で区切られます。 |
string |
必須 |
family_name |
エンドユーザーの姓。 文化によって、複数の姓がある場合はスペース文字で区切られます。 |
string |
必須 |
preferred_username |
エンドユーザーがクライアントでの使用を希望する短縮名(janedoeまたはj.doeなど)。 |
string |
必須 |
|
エンドユーザーの優先電子メール・アドレス。 |
string |
必須 |
email_verified |
エンドユーザーの電子メール・アドレスが検証済の場合はTrue。 エンドユーザーの電子メール・アドレスが検証済の場合はFalse。 |
boolean |
必須 |
gender |
エンドユーザーの性別(男性、女性またはその他)。 |
string |
必須 |
Locale |
エンドユーザーの場所。 |
文字列 |
必須 |
phone_number |
エンドユーザーの優先電話番号。 |
文字列 |
必須 |
phone_number_verified |
エンドユーザーの電話番号が検証済の場合はTrue。 エンドユーザーの電話番号が検証済の場合はFalse。 |
boolean |
必須 |
address |
エンドユーザーの優先住所。 |
JSONオブジェクト |
必須 |
updated_at |
エンドユーザーの情報の最終更新時刻。値はJSON数値で、1970-01-01T0:0:0Zから指定された日時までの秒数で表します(UTC)。 |
数値 |
必須 |
40.3 カスタム・クレーム
トピック
この内容は、OAMバンドル・パッチ12.2.1.4.210920以降のリリースにのみ適用されます。
この節では、以下のトピックについて説明します。
40.3.1 カスタム・クレームについて
OAMは、クライアント・レベルまたはドメイン・レベルで構成できるテンプレートを使用して、カスタム・クレームを定義する機能を拡張します。カスタム・クレームは、すべてのアクセス・トークン、IDトークンおよびユーザー情報に含めることができます。カスタム・クレームの値の変換や値のフィルタリングを実行することもできます。
カスタム・クレームはテンプレートを使用して定義され、使用の詳細はクライアント・レベルまたはドメイン・レベルで構成できます
ノート:
クライアント・レベルとドメイン・レベルの両方でカスタム・クレームが定義されている場合は、クライアント・レベルのクレームが優先されます。特定のクライアントまたは特定のドメインのすべてのクライアントで、アクセス・トークン、IDトークン、ユーザー情報レスポンスのいずれかまたはすべてにカスタム・クレーム名を含める必要があるかどうかを指定できます。
クライアントまたはドメインの作成時に、次の属性を設定できます:
アクセス・トークン | "accessTokenCustomClaims": ["<Claim_Name_For_AccessToken>"] |
IDトークン | "idTokenCustomClaims": ["<Claim_Name_For_IdToken>"] |
UserInfo | "userInfoCustomClaims": ["<Claim_Name_For_UserInfo>"] |
たとえば、アイデンティティ・ドメインの作成時に、アクセス・トークン("accessTokenCustomClaims":["ClientIP"]
)に"ClientIP"
というカスタム・クレームを指定した場合、そのアイデンティティ・ドメイン内のいずれかのクライアントを使用して作成されるすべてのアクセス・トークンにClientIP
カスタム・クレームが含まれます。
ノート:
クライアント・リクエストまたはドメイン・リクエストで使用する前に、カスタム・クレームを定義する必要があります。詳細は、「テンプレートを使用したカスタム・クレームの定義」を参照してください40.3.2 テンプレートを使用したカスタム・クレームの定義
管理者は、クライアントまたはドメイン・リクエストで使用する必要があるカスタム要求を定義する必要があります。
<admin-host>:<admin-port>/oam/services/rest/ssa/api/v1/template/{name}
REST APIを使用して、カスタム・クレームを作成します。APIには、作成する必要があるカスタム・クレームの名前が含まれている必要があります。たとえば、ClientIP
というカスタム・クレームを作成するには、<admin-host>:<admin-port>/oam/services/rest/ssa/api/v1/template/ClientIP
を使用する必要がありますノート:
次の名前は、テンプレートの作成ではサポートされていません。それらの値は上書きできません。- OAuth登録済クレーム名。rfc7519#section-4.1を参照してください
- IDTokenクレーム。https://openid.net/specs/openid-connect-basic-1_0.html#IDTokenを参照してください
sid
address
カスタム・クレームは、次の属性で定義する必要があります:
表40-3 カスタム・クレーム定義の属性と値
カスタム・クレーム属性 | 値 | 説明 |
---|---|---|
name |
<CustomClaim_Name> |
カスタム・クレームの名前。たとえば |
valueMapping |
<$namespace.var_name> |
クレーム値は、次のいずれかにマップできます:
動的値マッピングの詳細は、「ポリシー・レスポンスのネームスペースおよび変数名」を参照してください |
defaultValue |
<default_Claim_Value> |
オプション。このデフォルト値は、テンプレートの処理に失敗した場合に使用されます。
詳細は、「defaultValueについて」を参照してください |
transformFirst |
false またはtrue |
オプション。デフォルト値は 値が |
description |
オプション。このテンプレートに関連する詳細。 | |
dynamicParams |
オプション。パラメータは、dynamicParamsのエントリのリストとして定義する必要があります
詳細は、「dynamicParamsについて」を参照してください |
|
valueFiltering |
ブール値を返すJava文字列メソッド。 |
オプション。クレームの値をフィルタします。値フィルタは、戻り型がブールであるJavaメソッドを使用して定義する必要があります。 たとえば、 詳細は、「valueFilteringについて」を参照してください Java™ Platform, Standard Edition 8 API仕様のClass Stringも参照してください |
valueTransformation |
Java文字列変換メソッド |
カスタム・クレーム値に対する文字列変換。変換操作は、Javaメソッドを使用して定義する必要があります。 オプション。たとえば、 詳細は、「valueTransformationについて」を参照してください Java™ Platform, Standard Edition 8 API仕様のClass Stringも参照してください |
カスタム・クレームの定義でサポートされている属性の完全なリストは、REST APIのドキュメントを参照してください。
{
"valueMapping": "value of claim",
"defaultValue": "defaultValueForClaim",
"tranformFirst": "true or false",
"description": "string defining the template",
"dynamicParams": [
"$user.attr.userStoreattributeName"
],
"valueFiltering": {
"populateIf": "java string method with boolean return type",
"params": [
"param3",
"param4"
],
"type": [
"param3_type",
"param4_type"
]
},
"valueTransformation": [
{
"operation": "java String method name",
"params": [
"param1",
"param2"
],
"type": [
"param1_type",
"param2_type"
]
},
{
"operation": "java String method name",
"params": [
"param1",
"param2"
],
"type": [
"param1_type",
"param2_type"
]
}
]
}
40.3.2.1 valueTransformationについて
valueTransformation
を使用して、クレームの値を変換できます。
カスタム・クレーム値に対して文字列変換を実行できます。変換操作は、Javaメソッドを使用して定義する必要があります。
Java™ Platform, Standard Edition 8 API仕様のClass Stringを参照してください
例
次の例は、カスタム・クレームでのvalueTransformation
の使用を示しています。
例40-1
この例では、クレーム値sampleText
がsampleData
に変換されます
{
"valueMapping": "sampleText",
"valueTransformation": [
{
"operation": "replace",
"params": [
"Text",
"Data"
],
"type": [
"CharSequence",
"CharSequence"
]
}
]
}
例40-2
すべてのパラメータが文字列型の場合、type
を指定する必要はありません。たとえば:
{
"valueMapping": "sampleText",
"valueTransformation": [
{
"operation": "replaceFirst",
"params": [
"param1",
"param2"
]
}
]
}
例40-3
各変換の結果も文字列の場合は、変換を連鎖させることができます。最初の変換の結果は、次の変換の入力として取得されます。
次の例では、クレーム値sampleText
がSAMPLETEXT.STRING1.STRING2
に変換されます
{
"valueMapping": "sampleText",
"valueTransformation": [
{
"operation": "concat",
"params": [
"string1"
]
},
{
"operation": "concat",
"params": [
"string2"
]
},
{
"operation": "toUpperCase"
}
]
}
例40-4
sampleText1:sampleText2
が["sampleText1", "sampleText2" ]
に変換されますノート:
最初の操作の結果(split
)が文字列ではないため、"operation":"toUpperCase"
は適用されません。
{
"valueMapping": "sampleText1:sampleText2",
"valueTransformation": [
{
"operation": "split",
"params": [
":"
]
},
{
"operation": "toUpperCase"
}
]
}
40.3.2.2 valueFilteringについて
valueFiltering
を使用して、クレームの値(1つまたは複数)をフィルタできます。
値フィルタは、戻り型がブールであるJavaメソッドを使用して定義する必要があります。
Java™ Platform, Standard Edition 8 API仕様のClass Stringを参照してください。
ノート:
フィルタには、populateIf
タグまたはpopulateIfNot
タグのいずれかを含めることができますが、両方を含めることはできません。
populateIf
: このフィルタjavaメソッドの結果がtrue
の場合にのみ、クレーム値を返します。populateIfNot
: このフィルタjavaメソッドの結果がfalse
の場合にのみ、クレーム値を返します。
例
次の例は、カスタム・クレームでのvalueFiltering
の使用を示しています。
例40-5
次の例では、フィルタ処理された値は、populateIf
フィルタと一致しないためnull
を返します
{
"valueMapping": "sampleText",
"valueFiltering": {
"populateIf": "contains",
"params": [
"orcl"
],
"type": [
"CharSequence"
]
}
}
例40-6
すべてのパラメータが文字列型の場合、type
を指定する必要はありません。たとえば:
{
"valueMapping": "sampleText",
"valueFiltering": {
"populateIf": "endsWith",
"params": [
"Text"
]
}
}
40.3.2.3 defaultValueについて
テンプレートの処理中にエラーが発生した場合、クレーム値はnull
に設定され、クレームは戻されません。defaultValue
を設定することで、エラーの場合に特定のクレーム値にデフォルトを選択できます。
例40-7
この例では、テンプレートの処理後のクレーム値はdefaultSampleText
です。
この場合、無効なフィルタは"populateIf": "invalidMethodName"
として定義されます。したがって、クレームには構成されたデフォルト値が割り当てられ、変換などのそれ以上の処理は適用されません。
{
"valueMapping": "sampleText",
"defaultValue": "defaultSampleText",
"valueFiltering": {
"populateIf": "invalidMethodName",
"params": [
"ingsss"
]
},
"valueTransformation": [
{
"operation": "toUpperCase"
}
]
}
40.3.2.4 dynamicParamsについて
静的パラメータに加えて、valueTransformation
およびvalueFiltering
の定義中に動的パラメータを使用できます。
動的パラメータを使用するには、パラメータをdynamicParams
のエントリのリストとして定義する必要があります
例40-8
次の例では、クレーム値はsampleText
で、dynamicParams
は"$user.attr.email" : email.com
として定義されています。したがって、テンプレートの処理後に返されるクレーム値はsampleTextemail.com
です
{
"valueMapping": "sampleText",
"dynamicParams": [
"$user.attr.email"
],
"valueTransformation": [
{
"operation": "concat",
"params": [
"$user.attr.email"
]
}
]
}
40.3.3 認可リクエストでのClaimsパラメータの使用
認可リクエストにclaims
パラメータを追加して、個々のクレームをリクエストできます。
http://<admin-host>:<admin-port>/oauth2/rest/authz?
response_type=<>&
client_id=<>&
domain=<>&
state=<>&
redirect_uri=<>&
scope=<>&
claims=New parameter
claims
認証リクエスト・パラメータは、UserInfoエンドポイントから、またはIDトークン(あるいはその両方)で返される特定のクレームをリクエストします。
これは、クレームのリストを含むJSONオブジェクトとして表されます。
claims JSONサポート・キー
|
説明 |
---|---|
userinfo |
オプション。スコープまたはクライアント/ドメイン構成を通じてリクエストされている他のクレームに加えて、リストされた個々のクレームをUserInfoエンドポイントから返すようリクエストします。 |
id_token |
オプション。スコープまたはクライアント/ドメイン構成を通じてリクエストされている他のクレームに加えて、リストされた個々のクレームをIDトークンで返すようリクエストします。 |
これらのキーの値は、次のいずれかである必要があります:
claims JSONサポート値
|
説明 | サンプル |
---|---|---|
null |
このクレームがデフォルトの方法でリクエストされていることを示します |
|
JSONオブジェクト | オプション。リクエストされているクレームが必須クレームかどうかを示します。値がtrue の場合、これはクレームが必須クレームであることを示します。
ノート: essential のみがサポートされています。
|
|
詳細は、https://openid.net/specs/openid-connect-core-1_0.html#ClaimsParameterを参照してください
40.3.4 テンプレートベースのクレームの例
この項では、AccessToken、IDTokenおよびUserInfoでの値の変換、値のフィルタリングおよびカスタム・クレームの作成の例を示します。
例40-9 異なるユーザー・ストア属性を構成することによるクレーム値の変換
<users given name>.<users family name>@<users domain name>.com
を使用してカスタム電子メールが構成されます。値を次に示します。
- クレーム名は
CustomEmail
です $user.attr.given_name: "user"
$user.attr.family_name: "lastname"
$user.attr.domain_name: "domainName"
テンプレート処理後のクレーム値はuser.lastname@domainName.com
です
ノート:
可変長引数は配列として定義する必要があります。たとえば、CharSequence...
はCharSequence[]
として定義する必要があります。
{
"valueMapping": "$user.attr.given_name",
"tranformFirst": "true",
"dynamicParams": [
"$user.attr.family_name",
"$user.attr.domain_name"
],
"valueTransformation": [
{
"operation": "join",
"params": [
".",
"$user.attr.given_name",
"$user.attr.family_name"
],
"type": [
"CharSequence",
"CharSequence[]"
]
},
{
"operation": "concat",
"params": [
"@"
]
},
{
"operation": "concat",
"params": [
"$user.attr.domain_name"
]
},
{
"operation": "concat",
"params": [
".com"
]
}
]
}
例40-10 正規表現に基づく配列およびフィルタ・グループへのユーザー・グループ割当ての変換
この例では、ユーザー・グループ割当てがコロンで区切られた文字列から配列に変換され、管理セットに属するグループ値のリスト(adminまたはAdmin)が返されます
- クレーム名は
Groups
です $user.groups: "HR:Finance:Admin:Manager:HRadmin:Testadmin"
テンプレート処理後のクレーム値は["Admin", "HRadmin", "Testadmin"]
です
{
"valueMapping": "$user.groups",
"transformFirst": true,
"valueTransformation": [
{
"operation": "split",
"params": [
":"
]
}
],
"valueFiltering": {
"populateIf": "matches",
"params": [
".*[aA](dmin).*"
]
}
}
例40-11 UserinfoのOIDC標準クレームのLDAP属性へのマッピング
この例では、email_verified
はemailVerified
というLDAP属性から読み取ります
- テンプレートを使用してマッピングを作成します。テンプレート名は必要なクレーム名と一致する必要があります。
{ "valueMapping":"$user.attr.emailVerified" }
- クライアントまたはドメインを更新して、テンプレートベースのクレームを読み取ります
{ "userInfoCustomClaims": [ "email_verified" ] }
例40-12 OIDC標準クレームへの変換およびフィルタの適用
この例では、website
というクレームがフィルタ処理され、変換が適用されています。つまり、https
で始まる場合にのみ、小文字に変換されます。
- テンプレートを使用してマッピングを作成します。テンプレート名は必要なクレーム名と一致する必要があります。
{ "valueMapping": "$user.attr.website", "valueFiltering": { "populateIf": "startsWith", "params": [ "https" ] }, "valueTransformation": [ { "operation": "toLowerCase" } ] }
- クライアントまたはドメインを更新して、テンプレートベースのクレームを読み取ります。または、次のように、認可リクエスト・クレーム・パラメータの一部としてこのクレームをリクエストします:
http://<admin-host>:<admin-port>/oauth2/rest/authz? response_type=<>& client_id=<>& domain=<>& state=<>& redirect_uri=<>& scope=openid& claims={"userinfo":{"website": null}}
例40-13 AccessToken、IDTokenおよびUserInfoでのカスタム・クレームの追加
- テンプレートを使用してマッピングを作成します。テンプレート名は必要なクレーム名と一致する必要があります。
{ "valueMapping": "customValue" }
- カスタム・クレームの宛先を指定するようにクライアントまたはドメインを更新します
{ "accessTokenCustomClaims": [ "customClaim_accessToken" ], "idTokenCustomClaims": [ "customClaim_idToken" ], "userInfoCustomClaims": [ "customClaim_userInfo" ] }
例40-14 クライアント構成およびリクエスト・パラメータとしてのカスタム・クレームの追加
customClaim1
とcustomClaim2
などの2つのテンプレートを作成します。テンプレート名は必要なクレーム名と一致する必要があります。- カスタム・クレームの宛先を指定するようにクライアントまたはドメインを更新します
{ "idTokenCustomClaims": [ "customClaim1" ] }
- 認可リクエストのclaimsパラメータの一部として
customClaim2
をリクエストしますhttp://<admin-host>:<admin-port>/oauth2/rest/authz? response_type=<>& client_id=<>& domain=<>& state=<>& redirect_uri=<>& scope=openid& claims={"id_token":{"customClaim2": null}}
idToken
には、クライアント構成からのcustomClaim1
とリクエスト・パラメータからのcustomClaim2
の両方のクレームが含まれます。