38 12cでのOAuthサービスの構成
Oracle Access Management (OAM) OAuthは、サービスに対するセキュアなアクセスを支援します。OAuthサービスは、OAM 12cインストール・プロセスの一部として有効化されます。OAMでは、OAuthサービスを構成するためのAPIベースのアプローチが提供されます。設定時に、Oracle Access ManagerでOAuthクライアントおよびリソースを構成する必要があります。
この章の構成は、次のとおりです。
38.1 OAuthサービスの設定
管理者は、OAuthの設定を担当します。OAuthを構成してサービスへのアクセスを保護します。設定時に、Oracle Access ManagerでOAuthクライアントおよびリソースを構成する必要があります。この項では、APIを使用してOAuthサービスを有効化および管理する方法について説明します。
管理者として次の手順を実行します。
-
OAuthアイデンティティ・ドメインの構成および管理
-
OAuthリソースの構成および管理
-
OAuthクライアントの構成および管理
-
異なるサービス間の通信セキュリティの確認
-
REST APIコールを使用した保護サービスへのアクセス
OAuth構成の前提条件
-
必要なOAuth管理者権限を持っていることを確認します
-
12c環境がインストールされていることを確認します。『Fusion Middleware Oracle Identity and Access Managementのインストールおよび構成』の「Oracle Identity and Access Managementソフトウェアのインストール」を参照してください
-
構成セクションの使用可能なサービスで、OAuthおよびOpenIDConnectサービスが有効になっていることを確認します。「「共通構成」セクションの使用可能なサービス」を参照してください
-
OAuthのリソースとクライアントを構成します
-
クライアント・アクセス・トークンを取得します
OAuthの設定: タスク・フロー
この項では、OAMにOAuthを設定する際の上位レベル・タスクについて説明します。まずアイデンティティ・ドメインを作成し、リソースを登録してOAuthを設定します。OAuthリソースはOAuthクライアントを登録する前に登録する必要があり、クライアントの登録時に、リソース情報として、特にAPIの詳細が必要とされます。
-
REST APIコールを使用してアイデンティティ・ドメインを作成するには、「アイデンティティ・ドメインの作成」を参照してください
-
REST APIコールを使用して新しいリソースを登録するには、「リソースの作成」を参照してください
-
リソースを登録したら、OAuthクライアントを構成、登録できます。REST APIコールを使用して信頼できるクライアントを登録するには、「クライアントの作成」を参照してください
OAuth REST APIの詳細は、『Oracle Access ManagerでのOAuth REST API』を参照してください
38.2 OAuthサービス設定の構成
OAuthサービスには、認可プロトコルを使用する前に構成する必要のある多くのコンポーネントがあります。
OAuthサービス・コンポーネントおよびコンポーネントの連携動作の詳細は、「OAuthサービス・コンポーネントの理解」を参照してください。この項では、OAuthサービス・コンポーネントの構成方法について説明します。
この節では、以下のトピックについて説明します。
38.2.1 アイデンティティ・ドメインの作成
アイデンティティ・ドメインは、テナントの概念に対応します。すべてのクライアントおよびリソース・サーバーは、アイデンティティ・ドメインに作成されます。
curl
コマンドで使用される重要なパラメータは、次のとおりです。
-
identityProvider: 認証を実行する対象となるUserIdentityStore (パスワード付与フロー)。指定しない場合、これはDefaultIdentityStore - "UserIdentityStore1"にデフォルト設定されます
-
errorPageURL: 3-leggedフローの場合に使用されるカスタム・エラー・ページ。指定しない場合、これはOAMサーバーのエラー・ページにデフォルト設定されます。
-
consentPageURL: 3-leggedフローの場合に使用される顧客承認ページ。指定しない場合、OAMに付属するカスタム承認ページが使用されます。
-
tokenSettings: トークンのデフォルトは、IdentityDomainレベルで維持されます。tokenSettingsを指定しない場合、ACCESS_TOKENその他のデフォルト値が使用されます。
ノート:
RefreshTokenをAccessTokenとともに生成する必要がある場合、ACCESS_TOKEN設定でrefreshTokenEnabled=true
を設定する必要があります。
CRUD操作のエンドポイント:
http:<AdminServerHost:Port>/oam/services/rest/ssa/api/v1/oauthpolicyadmin/oauthidentitydomain
ノート:
REST API HTTPリクエストではContent-Type:application/jsonを使用します。アイデンティティ・ドメインを作成するには、2つの方法があります
-
簡易: このモードでは、作成するIdentityDomainの名前と説明のみが使用されます。残りの値はデフォルトに設定されます。
-
詳細: このモードでは、様々なパラメータに特定の値を指定できます。
- 簡易モードでドメインを作成するためのサンプルの
curl
コマンドは、次のとおりです。curl -i -H 'Content-Type: application/x-www-form-urlencoded' -H 'Authorization:Basic d2VibG9naWM6V2VsY29tZTE=' --request POST http:<Servername>:<Port>/oam/services/rest/ssa/api/v1/oauthpolicyadmin/oauthidentitydomain -d '{"name":"TestDomain","description":"Test Domain"}'
- 詳細モードでスコープを使用してドメインを作成するためのサンプルの
curl
コマンドは、次のとおりです。curl -i -H 'Content-Type: application/x-www-form-urlencoded' -H 'Authorization:Basic d2VibG9naWM6V2VsY29tZTE=' --request POST http:<Servername>:<Port>/oam/services/rest/ssa/api/v1/oauthpolicyadmin/oauthidentitydomain -d '{"name":"TestDomain","identityProvider":"UserIdentityStore1","description":"Test Domain"}' HTTP/1.1 200 OK Date: Fri, 28 Jul 2017 13:01:41 GMT Content-Length: 860 Content-Type: text/plain X-ORACLE-DMS-ECID: 78d30c19-07b6-4ac2-a39b-f1cbd8182ebb-000003fd X-ORACLE-DMS-RID: 0 Set-Cookie: JSESSIONID=_oGJSc7Vt2vIWLNQ_uwYCZz151JqOXewJRIkyvstnnio8WsNborT!-1875566563; path=/; HttpOnly Sucessfully created entity - OAuthIdentityDomain, detail - OAuth Identity Domain :: Name - TestDomain, Id - 1636d0492f36447087780abdfdc4c15f, Description - Test Domain, TrustStore Identifiers - [TestDomain], Identity Provider - UserIdentityStore1, TokenSettings - [{"tokenType":"ACCESS_TOKEN","tokenExpiry":3600,"lifeCycleEnabled":false,"refreshTokenEnabled":false, "refreshTokenExpiry":86400,"refreshTokenLifeCycleEnabled":false}, {"tokenType":"AUTHZ_CODE","tokenExpiry":3600,"lifeCycleEnabled":false,"refreshTokenEnabled":false,"refreshTokenExpiry":86400, "refreshTokenLifeCycleEnabled":false}, {"tokenType":"SSO_LINK_TOKEN","tokenExpiry":3600,"lifeCycleEnabled":false, "refreshTokenEnabled":false,"refreshTokenExpiry":86400,"refreshTokenLifeCycleEnabled":false}], ConsentPageURL - /oam/pages/consent.jsp, ErrorPageURL - /oam/pages/error.jsp, CustomAttrs - null
表38-1 OAuthアイデンティティ・ドメインの詳細
プロパティ 説明 値 tokenType 定義済ドメインのトークン・タイプを示します。 ACCESS_TOKEN
、AUTHZ_CODE
、SSO_LINK_TOKEN
tokenExpiry すべてのトークン・タイプに対して定義されたデフォルト値。 3600
ノート:
これはデフォルト値です。lifeCycleEnabled デフォルト値は false
です。すべてのトークン・タイプでtrue
に設定されます。false
refreshTokenEnabled デフォルト値は false
です。すべてのトークン・タイプでtrue
に設定されます。false
refreshTokenExpiry 任意のトークン・タイプのリフレッシュ・トークンの有効期限を指定します。 86400
ノート:
これはデフォルト値です。refreshTokenLifeCycleEnabled デフォルト値は false
です。すべてのトークン・タイプでtrue
に設定されます。false
ConsentPageURL 承認のカスタムJSPページを示します。 /oam/pages/consent.jsp
ノート:
これはデフォルト値です。ErrorPageURL エラーのカスタムJSPページを示します。 /oam/pages/error.jsp
ノート:
これはデフォルト値です。CustomAttrs アイデンティティ・ドメインのカスタム定義属性を示します。 null
ノート:
これはデフォルト値です。
38.2.1.1 サード・パーティ証明書を使用したトークン署名
アクセス・トークンは、即時利用可能な状態で生成された自己署名キー・ペアを使用して署名できます。OAMは、サードパーティのキー・ペアを使用してアクセス・トークンに署名できるように、このサポートを拡張します。管理者は、REST APIを使用してキー・ペアのライフサイクルを管理できます。
この内容は、OAMバンドル・パッチ12.2.1.4.210920以降のリリースにのみ適用されます。
サードパーティ証明書を使用してアクセス・トークンに署名できるようにするには、次のステップを実行します:
- 必要なキー・ペアをサーバーにアップロードし、
https://<admin-host>:<admin-port>/oam/services/rest/ssa/api/v1/keypairadmin/keypair
REST APIを使用してそのキー・ペアの別名を作成します。たとえば、公開キーと秘密キーをサーバーにアップロードし、次のようにKeyPair1
というそのキー・ペアの別名を作成できます:curl --location --request POST 'https://<admin-host>:<admin-port>/oam/services/rest/ssa/api/v1/keypairadmin/keypair' \ --header 'Content-Type: application/json' \ --header 'Authorization: Basic dGVzdDp0ZXN0=' \ --data-raw '[ { "aliasName":"KeyPair1", "publicKey":"MIIERDCCAyygAwIBAgIJAJ2KzwSAbV8GMA0GCSqGSIb3DQEBBQUAMIGjMQswCQYDVQQGEwJERTEQMA4GA1UECBMHQmF2YXJpYTEPMA0GA1UEBxMGTXVuaWNoMRgwFgYDVQQKEw9NSVQteHBlcnRzIEdtYkgxFjAUBgNVBAsTDUhCQlRWLURFTU8tQ0ExGzAZBgNVBAMTEml0di5taXQteHBlcnRzLmNvbTEiMCAGCSqGSIb3DQEJARYTaW5mb0BtaXQteHBlcnRzLmNvbTAeFw0xNzEwMjIxMTA4NDJaFw0yMjEwMjExMTA4NDJaMIGhMQswCQYDVQQGEwJERTEQMA4GA1UECAwHQmF2YXJpYTEPMA0GA1UEBwwGTXVuaWNoMRgwFgYDVQQKDA9NSVQteHBlcnRzIEdtYkgxEDAOBgNVBAsMB1RFU1QgQ0ExHzAdBgNVBAMMFnRlc3Rib3gubWl0LXhwZXJ0cy5jb20xIjAgBgkqhkiG9w0BCQEWE2luZm9AbWl0LXhwZXJ0cy5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC4GnIWd1Mxts1ZDCt6JPTV0mvFn+ZrwqE/4WFNAaqtRaChaP21NQ1H55NFNYo1Dl2AhDDNK1MUk+rq6LZOWm8XiuMBA/fs3uBNEloa9WYoAEb3ozS14AG+d1yq41diNl4F2ys1f10s4gW/H27UHl2G1Bgb9Zx1yFZHYItjGKpTl5I8fO/MQtWFvqoK9rY0UxYHpS6Tnfc7ArrQMNsOFu4015N8JuDDtizNxsq8sOK2MgQZNeuOg+ST+8jrJR8CbxRuvejfhZM2QMfBeACjFyxQGBn4UZkys46Y5lXJCx7n6Zix1p+y9qNrJjEdup9O9q9VIjS86K1wPz62JqaVl6R7AgMBAAGjezB5MAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBRCN+ztRIOc3iF130yCGbkBAOK+oTAfBgNVHSMEGDAWgBTEbk/zoRG4/M/5q7Z9Er8rKAgPcjANBgkqhkiG9w0BAQUFAAOCAQEAUHAPBfoLvB/krCTgBZhswxbLutQCB8hDG3rPspJsD3TUHhSUlWxHulxSBMfNKMv1lKA1SX/4+2epkpz825eO47u0SLsmSlXdzfsOt0GLqbB9IQOnTxu2/3z/gtNaHUlDo2JQf24CfGAFQVv+2Fp8+3B5DvKvuHIEGR6A27Ua/wBR78Of1jdwvMBEgDeN5+R5r0HjCt/A5ODdG9j8p+wpYQaMWZ6A2iOMWEdgvQnQeW2B5gD9mOV1gCh4HCYMXf/apuWZEoafm6qd1Q+SeB4D/LbsnDQN1uzqrTj8Jg7C1h55KNMeYECYWBKiqeztxBdLGEjkqCZarnUNYEfzXDPbpw==", "privateKey":"MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIjJCdZa17o0YCAggAMBQGCCqGSIb3DQMHBAhwwPasgNmZVASCBMjTi8XLv8f7Os7vuJE8n4WmQCSp7Q6LwZO5cdvBtvQDbKzTlZbRudIz54jDLQDkaXT8zPBIPdnF4frjKqIzrK1EY0+3oTILGeWabxvbvSDkdbyES98euhunNZcBnvm+JYmAm6IcMv11kPu57as8uUUDMoFpqsy7DZ7QhE9BxKdKSAkyPXkefuB5UpYnTjzZgES9BAYNedhjpKDXX2et1PwnFpbTndbT6Ur5SbnzMpZYPuG+G9+sedCJMpspd8yS178hf0UfftAhKLHpIjzQGYWh+c3BvMzd3f7xIK1/iTme5TJV3SOQNPEQ7E1tyVtwip/LvXEKEUvw0yOsFBqS+teHMT9wLnCn5oAXyuFI7RcH0x3Y57AJu4xthoL71wSoiYB+WrZD5AmQmMfAliO1AC4LA8TLGID0GVwM58AD8p+9QJwABi4rag0wwuBDOBt3FOqc0donyo4/NS2S8WZmr93A7WwB9KzD1SrYviPpIqPNSsExosT7dgcW0LzmKcE1zqzkPb1C2nzQu+Y8vmlNyDUW3jp0Ao0fudJZJ1+BEiNc1wMnBQXNkE42u7rDF8/Jo2r8tsOKa0ErHoRjNLpyzsfjLp+C6wwBcnCJRxSXwvf+CPeN09cMkR3Jt2qzwZJ22NvzeTgK+2vA0dCH4rFgylHKvag2FhGYw5O/8JWMN5mKLUB03GmMz3PjRG7DT5acEnO1YV3AAoeoSD84RNRS8oxH7AOhSwvMi8Xu/SqkuYfRy2hr8oXEmE5M790aPiGkDUTY1A0pPYr02fvQFf5P3VQ1kDT3+W402dDl7yVGmvgWSz+ABm8cGS1eyTq/O43XEPD55LH6o8gnFH3Ba6/sI6vRTDkn0mqVuxTJgpnpMpYsitcLNl066OFgzzdvBdxREp5qjy+meqdX+j6rm42CTnDDuWsyyKvFzK89LD4o0QjHdt+t9sMhS5PYcj5QTAqKFoWVlAFru41th7nSnRUzonBKaD40qsgnUHOWdRSnMRqmoXbTMKt6mx6xgPPeK266GSqMcrXCfdzRwU3Ad1Xw6fAcFXnqbI9CQuQ8ADSg6lW3BZqZyM0I+jr9vib1tdTrTuMkDtDg1gDcVzcgaRLJ7GJF2Az5mfyGs61uDBhycxRgAhOA7ehu7cEU708y5UYjaTizWtGmpnAt+bS7KNopqEhzP6OpP8FMKfvqvgwMWpm++AyEMbAswhjaz9LjI0HtTuQTKlBLBHzm1TVIOwn+5bd4W917uVfXCJdS8OaEwkFzGBXhJvkwBGlMvYO+gr3Kbio2O2QfjfXNlgob8EfDMPH3N8gkpdSulLzYEzK+2lNz3h1bm07evz2w2xTy9PYP1UD1UCugFA18RI+4YdnaIBSyeReODRhaE4AF+T2oAu3rE9c9iCauC9QOSICsULyGbLny54R9tk1wdAJI4xASPHoizz8GqqF8s6Y2/F46LS+43042rkfQmvdr5yrjYsF7YphSQzp7MREq+QwgXjC8kc5LMn81o2Ii6DcsyEQVBimfu055FFE1IHnUYKKBrxJU77+jpqb/pXlqvsm7ucBVCpRDl1EvRkSji8qPk60aFotPfNNxOvIWLOjHkaYzfASbtZ/G8H2nZMZWTdtxY+tgS8R6Bo+sJZH/NnE=" }, { "aliasName":"KeyPair2", "publicKey":"MIIEqDCCApCgAwIBAgIUK5Ns4y2CzosB/ZoFlaxjZqoBTIIwDQYJKoZIhvcNAQELBQAwfjELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xDzANBgNVBAoMBkJhZFNTTDExMC8GA1UEAwwoQmFkU1NMIENsaWVudCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw0xOTExMjcwMDE5NTdaFw0yMTExMjYwMDE5NTdaMG8xCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1TYW4gRnJhbmNpc2NvMQ8wDQYDVQQKDAZCYWRTU0wxIjAgBgNVBAMMGUJhZFNTTCBDbGllbnQgQ2VydGlmaWNhdGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDHN18R6x5Oz+u6SOXLoxIscz5GHR6cDcCLgyPax2XfXHdJs+h6fTy61WGM+aXEhR2SIwbj5997s34m0MsbvkJrFmn0LHK1fuTLCihEEmxGdCGZA9xrwxFYAkEjP7D8v7cAWRMipYF/JP7VU7xNUo+QSkZ0sOi9k6bNkABKL3+yP6PqAzsBoKIN5lN/YRLrppsDmk6nrRDo4R3CD+8JQl9quEoOmL22Pc/qpOjL1jgOIFSE5y3gwbzDlfCYoAL5V+by1vu0yJShTTK8oo5wvphcFfEHaQ9w5jFg2htdq99UER3BKuNDuL+zejqGQZCWb0Xsk8S5WBuX8l3Brrg5giqNAgMBAAGjLTArMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgeAMAsGA1UdDwQEAwIF4DANBgkqhkiG9w0BAQsFAAOCAgEAZBauLzFSOijkDadcippr9C6laHebb0oRS54xAV70E9k5GxfR/E2EMuQ8X+miRUMXxKquffcDsSxzo2ac0flw94hDx3B6vJIYvsQx9Lzo95Im0DdTDkHFXhTlv2kjQwFVnEsWYwyGpHMTjanvNkO7sBP9p1bN1qTE3QAeyMZNKWJk5xPlU298ERar6tl3Z2Cl8mO6yLhrq4ba6iPGw08SENxzuAJW+n8r0rq7EU+bMg5spgT1CxExzG8Bb0f98ZXMklpYFogkcuH4OUOFyRodotrotm3iRbuvZNk0Zz7N5n1oLTPlbGPMwBcqaGXvK62NlaRkwjnbkPM4MYvREM0bbAgZD2GHyANBTso8bdWvhLvmoSjsFSqJUJp17AZ0x/ELWZd69v2zKW9UdPmw0evyVR19elh/7dmtF6wbewc4N4jxQnTqIItuhIWKWB9edgJz65uZ9ubQWjXoa+9CuWcV/1KxuKCbLHdZXiboLrKm4S1WmMYWd0sJm95H9mJzcLyhLF7iX2kK6K9ug1y02YCVXBC9WGZc2x6GMS7lDkXSkJFy3EWhCmfxkmFGwOgwKt3Jd1pF9ftcSEMhu4WcMgxi9vZr9OdkJLxmk033sVKI/hnkPaHwg0Y2YBH5v0xmi8sYU7weOcwynkjZARpUltBUQ0pWCF5uJsEB8uE8PPDD3c4=", "privateKey":"MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIFGJVk+2yRcECAggAMBQGCCqGSIb3DQMHBAgI8pa9pbh96ASCBMgOltVUbtkUcupvbL2Eh2Cy5YIO9cCQcgfA9xTBUnhCivgyPDaqJ6iM0ryIdVdvHLn0gySpqo3TSUZheygU7cBQvILdTt6Of02yf3Gp7Xs8CAs3qNODUTK51QGwDSJ4zyFquiEUNgSeG6UMji/9Y09791ONVYmvz7ZqPwYOK0HwSOF9ttXzAVA9GKMpnCy97G0ezkzFhInBtf/nMYuRbWwCddN/zt0IX7Yo6AnF91QzluGUXGnENJufvKj7q3DSTVolWyQgHlCrq/0BMextYxe9GSjHF2UTCUDbmi6Vv1Z3ezkkKuQMPXCZ/qOgQFyx4PWmtXKBj3EPZYTI0dTebhCmXv614UIglFwyPQPLVJR0GlZIRAw4pM01BBMSlwLrjMBcW7EUUJ7DyvBX9bJe7vZ0nMS1kSQyWU031RRbK1Yt16QtdV+sw9ZCCB8ZEQ+4y06dJvpapmGzH5QjSZzgh9Sp+wXoqiovvjdKcxzPg3WjclSj/MtetDlBDDq9K1hEuc5eNL8Qr/yiX8C/9Uk8JbcUaJMeq4H2nZiOgY+DzpMuEEJJo81WztrrFu8KB2oeky5EZ3akB0OKy0bL8MScLkVNbJFzv290P/Jj/y6JTo2VzoF+bu5l9mySjDMxci218+NC7oOwiIzNJPR3IWoLmoRYoXUAyl1tTaZWAmHai6iypXSeskc1Ezvp4STMK7oqbkf2DXNY+F5wDP3HdD1Yb6FrziKbrQ67+qY+XSXIV/Abm2c5ELnHsIFkGV/xDdWkoh+C5Lg8XssnqH0tcuCuyGqZKDHBVoa/xvpq5rCd2i2MWrImC0lvyOksDfsrluzAXSXPmtHwiPir6iDb5srlmaJCEKvrRdNxNK28kFzCshNtEivEiu9DH+5cMdbAilBYEFbk0N/uRNzG4doieCElYMD/yZE51oq7S7JVq61Ff7O6KT1SZQVusumCeyE28HlocyWuNMMc9jJ1YJ68dBH/9YPeGNeBu8qCgXdFgSBEdcAD2p5FNzMyZuWRwENne7MNt8EgUBLpc+kPZ07lRNyF8GFx3A+U2etNPjGA6a64jGhcM5KcZreJ8wffprFpAuY4rFPJkQ5xyyaxlRrrlhSOrAj6wTiNZVWcuA20URdilhOpHzbq+J9zrtnNCLMkIVCB8YFtjt5puciltD3cD8eg5DPhQntLVdJiUfyZsApC8RWamwfzCsN9MRo70Qxl4pC4qKYmBDYdyGeQpfi7C69+7153AKqr2ZjhCdaJ3/g1EAh3PJOCKqetrPqkNfZnEMJz+9nhmgcIn10l3tlDFbB1Biship6GHx+d6PT7AZRei704JsAnyCOD1xyWd8UlWlXgbr0zQol4c5KiByho7mZlajVWzqKapz4OBnTFKmWW9KoFSXWp0kKGcxAGPC+FL8EGXErvSlmbVf8MKfs4eLnKidzL1MKW1pS4n9cwKHmZjPVv0YYUgGEw8FAuH0DjQBvnLrCbWLY3DXHR/GAf9hagSa0G0FO7MvQcSWE5eqXwICJ9PMhxiEEx9PF0QJuMxhs6bni/thZqFOYDN0kbmSNntB0kG4EwWCxKoegEUMX7Ug5R0IGilLJ37Q9NQvh21msH3mi8KcfuO1keeSdZJPbFFkCVHCPMGx6QRY8=" } ]'
次の例に示すように、p12ファイルを使用してキー・ペアをアップロードし、そのキー・ペアの別名KeyPair1
を作成することもできます:ノート:
キー・サイズは2048ビット以上で、p12ファイルには公開キーと秘密キーのペアを1つのみ含める必要があります。curl --location --request POST 'https://<admin-host>:<admin-port>/oam/services/rest/ssa/api/v1/keypairadmin/keypair?password=<your_password>&aliasName=KeyPair1' \ --header 'Content-Type: application/x-pkcs12' \ --data-binary '@/u01/keypairfiles/p12files/your_file-client.p12'
password
は、p12ファイルのパスワードです。詳細は、REST APIのドキュメントで新しいKeyPairの追加に関する項を参照してください。
defaultSigningKeyPair
およびkeyPairRolloverDurationInHours
を使用して、キー・ペアを必要なOAuthアイデンティティ・ドメインに関連付けます。defaultSigningKeyPair
このドメインからのトークンの署名に使用するキー・ペア別名の名前を指定します。 ノート:
ここでキー・ペア別名を使用する前に、システムに作成する必要があります。詳細は、前のステップを参照してください。keyPairRolloverDurationInHours
新しいキー・ペアがドメインに関連付けられた後、前のキー・ペアがドメインでアクティブなままになる時間数を指定します。 この間に、前のキー・ペアで署名されたトークンが検証され(トークンが期限切れでない場合)、前のキー・ペアの公開キーはドメインのJSON Webキーセットに含められます。
サポートされている値:
0
から99999
時間。デフォルトは
48
時間です。REST APIドキュメントで別名に基づいたKeyPairの削除に関する項を参照してください
たとえば、
curl --location -g --request PUT 'https://<admin-host>:<admin-port>/oam/services/rest/ssa/api/v1/oauthpolicyadmin/oauthidentitydomain?name=Domain1' \ --header 'Authorization: Basic dGVzdDp0ZXN0=' \ --header 'Content-Type: application/json' \ --data-raw '{ "defaultSigningKeyPair": "KeyPair1", "keyPairRolloverDurationInHours": "24" }'
詳細は、アイデンティティ・ドメインRESTエンドポイントのドキュメントを参照してください。
ノート:
トークンの署名検証を実行するには、jwks_uri
: http://<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/security
を使用して信頼証明書を取得できます。
jwks_uri
は、OpenIDConnect検出エンドポイントを使用して取得できます。詳細は、「OpenIDConnectの検出エンドポイントの構成」を参照してください
38.2.2 承認管理の有効化
各OAuthアイデンティティ・ドメインまたはOAM内のすべてのOAuthアイデンティティ・ドメインの承認管理を有効にできます。
3-legged OAuthフローでは、OAMはリソースへのアクセス権を付与できる承認ページを提示します。承認管理が有効な場合、承認は保存され、OAMは後続の3-legged OAuthフローでの承認をスキップします。3-legged OAuthフローの詳細は、「3-legged認可の理解」を参照してください
デフォルトでは、承認管理は無効になっています。
OAuthアイデンティティ・ドメインごとに承認管理を有効化するには、管理サーバーOAuth APIを使用してカスタム属性consentExpiryTimeInMinutes
を設定することにより、OAuthアイデンティティ・ドメインを作成または変更します。
たとえば:
curl --header 'Authorization: Basic d2VibG9naWM6d2VsY29tZTE=' \
--header 'Content-Type: application/json' \
--request POST 'http:<Servername>:<Port>/oam/services/rest/ssa/api/v1/oauthpolicyadmin/oauthidentitydomain' \
--data-raw '{"name":"MyDomain","identityProvider":"UserIdentityStore1","description":"MyDomain",
"tokenSettings":[{"tokenType":"ACCESS_TOKEN","tokenExpiry":3600,"lifeCycleEnabled":false,"refreshTokenEnabled":false,"refreshTokenExpiry":86400,"refreshTokenLifeCycleEnabled":false}],
"errorPageURL":"/oam/pages/error.jsp","consentPageURL":"/oam/pages/consent.jsp",
"customAttrs":"{\"domainCertValidityInDays\":\"30\", \"consentExpiryTimeInMinutes\":\"10\"}"}
'
ここで、consentExpiryTimeInMinutes
(分単位)は、OAuth承認が有効な期間を表します。
この期間を超えると、OAMによって3-legged OAuthフローで承認ページが再度表示されるため、承認を付与する必要があります。
OAMでは、各OAuthアイデンティティ・ドメインで、consentExpiryTimeInMinutes
を使用して、承認の有効期間を有効化、無効化または変更できます。
consentExpiryTimeInMinutes
システム・プロパティを追加します。
- すべての管理サーバーおよび管理対象サーバーを停止します。
$OAM_DOMAIN_HOME/bin/setDomainEnv.sh
を編集し、次に示すように、EXTRA_JAVA_PROPERTIESの下にconsentExpiryTimeInMinutes
プロパティを追加しますEXTRA_JAVA_PROPERTIES="-DconsentExpiryTimeInMinutes=10"
- 管理サーバーおよび管理対象サーバーを開始します。
ノート:
システム・プロパティは、各OAuthアイデンティティ・ドメインの個々の承認管理構成をオーバーライドします。『Oracle Access ManagerでのOAuth REST API』も参照してください。
38.2.3 リソースの作成
リソース・サーバーは、保護されているリソースをホストします。リソース・サーバーは、アクセス・トークンを使用して、保護されているリソースのリクエストを受け入れて応答することができます。
curl
コマンドで使用される重要なパラメータは、次のとおりです。
-
Name: リソース・サーバーの名前
-
Scopes: 次の2つのパラメータが使用されます
-
scopeName - スコープの名前
-
description - スコープの説明
-
-
idDomain - このリソース・サーバーが作成されるIdentityDomainの名前
-
tokenAttributes - アクセス・トークンの一部としてサーバーから送信されるカスタム属性のリスト。属性は、値がそのまま置換される場合は"STATIC"になります。"DYNAMIC"の場合、attributeValueが評価され、最後のAccessTokenで移入されます。
ノート:
スコープは、リソース・サーバー名の接頭辞付きで示されます。これにより、それらはリソース・サーバー間で一意となります。
CRUD操作のエンドポイント:
http:<AdminServerHost:Port>/oam/services/rest/ssa/api/v1/oauthpolicyadmin/application
ノート:
REST API HTTPリクエストではContent-Type:application/jsonを使用します。38.2.4 クライアントの作成
クライアントは、リソース所有者のかわりに、リソース所有者の認可を使用して、保護されているリソースのリクエストを作成するアプリケーションです。
curl
コマンドで使用される重要なパラメータは、次のとおりです。
-
Name: クライアントの名前
-
idDomain: クライアントが作成されるidentityDomainの名前
-
secret: CONFIDENTIAL_CLIENTの場合のクライアント秘密
-
clientType: クライアントのタイプ。サポートされる値 - CONFIDENTIAL_CLIENT、PUBLIC_CLIENT、MOBILE_CLIENT
-
redirectURIs: クライアントに構成されたredirectURIsのリスト
-
attributes: クライアントに構成されたカスタム属性のリスト
-
grantTypes: 許可された権限タイプのリスト。許可された値 - PASSWORD、CLIENT_CREDENTIALS、JWT_BEARER、REFRESH_TOKEN、AUTHORIZATION_CODE
-
Scopes: クライアントがアクセスをリクエストできるスコープのリスト。
-
scopeName - スコープの名前。これは、<ResourceServerName>.<ScopeName>で示されます
-
-
defaultScope - これは、ランタイム・フローでスコープを指定しない場合にアクセス・トークンが生成される際のデフォルト・スコープです。
CRUD操作のエンドポイント:
http:<AdminServerHost:Port>/oam/services/rest/ssa/api/v1/oauthpolicyadmin/client
ノート:
REST API HTTPリクエストではContent-Type:application/jsonを使用します。38.3 ユーザー・ロック検証の有効化
ユーザーがロックまたは無効化されたときにトークンを無効化するために、ユーザー・ロックの検証を有効にする必要があります。
ユーザーがロックまたは無効化されると、OAuthユーザー検証フローが失敗します。OAuthユーザー検証は、OAuth認可付与、JWTベアラー付与、リフレッシュ・トークン付与およびアクセス・トークン検証フロー中に実行されます。
たとえば、ユーザー・ロック検証を有効にすることで、アクセス・トークン(リフレッシュ・トークンを使用)が、ロックまたは無効化されたユーザーに対して発行されなくなります。
前提条件
進める前に、次のステップを実行して、LDAPNoPasswordValidationSchemeOAuth
認証スキームが存在するかどうかを確認します。
- Oracle Access Managementコンソールにログインします。
- Oracle Access Managementコンソールの右上で「アプリケーション・セキュリティ」をクリックします
- 「アプリケーション・セキュリティ」起動パッドで、「Access Manager」の下の「認証スキーム」をクリックします
LDAPNoPasswordValidationSchemeOAuth
という名前を指定し、「検索」をクリックします。- 検索で認証スキームが返されるかどうかに応じて、次のいずれかを実行します。
- 認証スキームが存在する場合は、「LDAPNoPasswordValidationSchemeOAuthが存在する場合のユーザー・ロック検証の有効化」に示されているステップに従います。
- 認証スキームが見つからない場合は、最新のOAMパッチをダウンロードし、「LDAPNoPasswordValidationSchemeOAuthが存在しない場合のユーザー・ロック検証の有効化」にリストされているステップに従います。
38.3.1 LDAPNoPasswordValidationSchemeOAuth
が存在する場合のユーザー・ロック検証の有効化
ユーザー・ロック検証を有効にするには、次のステップを実行します。
- Oracle Access Managementコンソールにログインします。
- Oracle Access Managementコンソールの右上で「構成」をクリックします。
- 「ユーザー・アイデンティティ・ストア」をクリックします
- 「OAM IDストア」の下で、ユーザー・アイデンティティ・ストアを選択し、「編集」をクリックします。
- 「ネイティブIDストア設定の使用」の横のボックスを選択します。
- 「パスワード管理」の下で、「パスワード管理の有効化」の横のボックスを選択します。
これらのパラメータの詳細は、「ユーザー・アイデンティティ・ストア設定」を参照してください
38.3.2 LDAPNoPasswordValidationSchemeOAuth
が存在しない場合のユーザー・ロック検証の有効化
ユーザー・ロック検証を有効にするには、次のステップを実行します。
- 「LDAPNoPasswordValidationSchemeOAuthが存在する場合のユーザー・ロック検証の有効化」で説明されているステップに従います。
- 新しい認証スキームを作成します(
LDAPNoPasswordValidationSchemeOAuth
など。名前には任意の文字列を使用できます):- Oracle Access Managementコンソールの右上で「アプリケーション・セキュリティ」をクリックします
- 「アプリケーション・セキュリティ」起動パッドで、「Access Manager」の下の「認証スキーム」をクリックします
- 「認証モジュール」のドロップダウンで、
PasswordPolicyValidationModuleOAuth
を選択しますノート:
PasswordPolicyValidationModuleOAuth
は、OAMインストールですぐに使用できます。 - 認証スキームに、チャレンジ・パラメータ
noAuthnCheckForPwdManagement=true
を設定します。 - 認証スキームに、他のパラメータを設定します。たとえば、次の図は、認証スキーム・ページのサンプルを示しています:
- 作成した新しいスキームで認証ポリシーを更新します。
- 「アプリケーション・セキュリティ」起動パッドで、「Access Manager」の下の「アプリケーション・ドメイン」をクリックします
- 「検索」をクリックし、「検索結果」の下で「IAM Suite」をクリックします
- IAMスイート・アプリケーション・ドメインで、「認証ポリシー」タブをクリックし、OAuthアサーション・ポリシーをクリックします
- 「認証スキーム」のドロップダウンで、作成した新しいスキームを選択します。たとえば、
LDAPNoPasswordValidationSchemeOAuth
です - 「適用」をクリックします。
38.4 MDCでの承認管理の有効化
この項のステップに従って、MDCで承認管理を有効にします。
ノート:
既存のMDC構成の承認管理を有効にするには、MDCを再構成する必要があります。- 2つのOAM環境、DC1 (マスター)とDC2 (クローン)を設定します。
- マスターのOAuthアイデンティティ・ドメインに
consentExpiryTimeInMinutes
パラメータを設定します。詳細は、「承認管理の有効化」を参照してください。 - マルチデータ・センターでOAuthを構成します。詳細は、「マルチデータ・センターでのOAuthの構成」を参照してください
- 自動ポリシー同期を有効にします。詳細は、「自動ポリシー同期の有効化」を参照してください
38.5 マルチデータ・センターでのOAuthの構成
REST APIを使用してマルチデータ・センター(MDC)でのOAuthサポートを構成できます。
-
OAuthアーティファクト(マスターDC上のアイデンティティ・ドメイン、リソース・サーバー、クライアントおよび関連付けられた信頼アーティファクト)を作成します。
-
「マルチデータ・センターの構成」で示したステップに従って、2つのデータ・センター間にMDCを設定します。
ノート:
ステップ2の一部として、マスター上でexportAccessStore、クローンDC上でimportAccessStoreの各リクエストが実行されます。これにより、マスターDC上に作成されるアーティファクトをクローンDC上で認識できることが保証されます。ステップ2では、OAuthアーティファクトがクローンDCにコピーされることも保証されます。
-
クローンDC上でこれらのアーティファクトの
GET
コマンドを実行して、OAuthがMDCモードで正常に設定されたことを確認します。 -
自動ポリシー同期の有効化
-
次に、2段階のフローを実行してMDCフローを検証します。
-
パスワード付与フローの一環として、DC1上にアクセス・トークンを作成します。
-
検証のためにクローンDCエンドポイントに同じトークンを送信します。
-
トークンはDC2上で有効である必要があります。
-
38.6 マルチデータ・センターでの承認管理のオプション・パラメータ
クローン・データ・センターのランタイム・サーバーのシステム・プロパティで、次のオプション・パラメータを設定できます。
- すべての管理サーバーおよび管理対象サーバーを停止します。
$OAM_DOMAIN_HOME/bin/setDomainEnv.sh
を編集し、EXTRA_JAVA_PROPERTIESの下にパラメータを追加します。たとえば、EXTRA_JAVA_PROPERTIES="-DconsentExpiryTimeInMinutes=10"
- 管理サーバーおよび管理対象サーバーを開始します。
表38-2 MDCでの承認管理のオプション・パラメータ
パラメータ | デフォルト値 | 説明 |
---|---|---|
failOnConsentStoreError |
true |
デフォルトでは、マスターDCが使用できない場合、ユーザー承認リクエストは処理されず、ユーザーにエラーが表示されます。 エラーをオフにするには、パラメータの値を |
printEntitiesInRequest |
false |
HTTPリクエストとレスポンスの本文をログに出力します。 |
runtimeResourceConnTimeout |
60000 ミリ秒(60秒)
|
マスターDCに対してエンティティを格納/フェッチ/削除するHTTPリクエストの接続タイムアウトを指定します。 |
runtimeResourceReadTimeout |
60000 ミリ秒(60秒)
|
マスターDCからのHTTPレスポンス読取りタイムアウトを指定します。 |
sourceDcJournalThreshold |
100 |
ランタイム・サーバーからのオンデマンド・レプリケーションの制限を定義します。
この制限の後、オンデマンド・レプリケーションが開始され、すべてのユーザー・リクエストもマスターから結果をフェッチしようとします。 |
sourceDcJournalThresholdUpperLimit |
250 |
オンデマンド・レプリケーションの上限を定義します。
クローンDCとマスターDCのジャーナル・シーケンスの差が定義された制限を超えると、すべてのユーザー・リクエストに対してOAMRE-07023エラーが管理者に表示されます。 |
sourceDcLastPingThresholdInSec |
600 秒(10分)
|
マスターの可用性の制限を定義します。
この時間制限内にマスターへの最後のpingが成功した場合、マスターは使用可能と見なされます。 このパラメータの値は、常に |
sourceHealthCheckIntervalInSec |
120 秒(2分)
|
マスターDCで接続および最新のジャーナル・シーケンスをチェックするためのポーリング頻度を指定します。 |
replication.poller.thread.interval |
120 秒(2分)
|
ポリシー・マネージャでレプリケーションを実行すると、ポリシー・マネージャ・クラスタにより複数のインスタンスが生成される場合があります。レプリケーション・インスタンス・マネージャ・スレッドは、レプリケーションの単一のインスタンスがクラスタ化環境で実行されていることを確認します。
このパラメータは、レプリケーション・インスタンス・マネージャ・スレッドが実行される間隔を定義します。 |
replication.database.thread.interval |
120 秒(2分)
|
ポリシー・マネージャ・クラスタ上の単一のレプリケーション・インスタンスは、データベースにエントリを持ち、それを継続的に更新することで維持されます。すべてのクラスタは、挿入操作または更新操作を実行し続けます。
このパラメータによって有効なデータベース・エントリ継続期間が決定されます。つまり、インスタンスが期間(2分など)内にデータベース・エントリを更新した場合、他のインスタンスはそれをオーバーライドできません。 ただし、インスタンスがエントリの更新に失敗した場合、他のインスタンスは期間の後にデータベース・エントリを更新できます。 |
38.7 MDCでの承認管理のエラー・コードおよびトラブルシューティング・ ステップ
この項では、MDCでの承認管理のエラー・コードおよびトラブルシューティング・ステップを示します。
エラー・コード | エラーの説明 | 解決方法 |
---|---|---|
OAMRE-07001 | ユーザー・データが変更されたが、削除されたデータがメイン・ストアにまだ残っている場合、エラーはマスターDCに記録されます。 | ログに存在する一意のIDで識別されるランタイム・データを手動で削除します。 |
OAMRE-07002、OAMRE-07018、OAMRE-07019 |
同じマスターDCを指すレプリケーション承諾が複数ある場合、エラーはクローンDCに記録されます。 |
レプリケーション承諾は、マスターDC (ソースDC)とクローンDC (ターゲットDC)から1つのみである必要があります。 レプリケーション承諾Rest APIを使用して、複数のレプリケーション承諾を削除します。 |
OAMRE-07004 | レプリケーション承諾が変更および削除され、古いレプリケーション承諾が無効になった場合、エラーが発生します。 | クローンDCで管理対象サーバーを再起動します。 |
OAMRE-07006 | マスターDCレプリケーションAPIが機能しないか、現在のレプリケーション承諾が有効でない場合、エラーが発生します。 | クローンDCで管理対象サーバーを再起動します。 |
OAMRE-07008 | MDCがポリシー・マネージャRESTエンドポイントなしで設定されている場合、エラーがログに記録されます。 | PolicyManagerRESTEndpoint という名前でMDC構成にポリシー・マネージャRESTエンドポイントを追加します |
OAMRE-07009 | レプリケーション承諾が存在しない場合、およびマスターの接続に使用できる認可コードがレプリケーション承諾にない場合、エラーがログに記録されます。 | 必要な認可コードを持つレプリケーション承諾が存在することを確認してください。 |
OAMRE-07010、OAMRE-07011、OAMRE-07012、OAMRE-07013、OAMRE-07016、OAMRE-07020、OAMRE-07022 | マスターDCリソースが存在しない場合、およびマスターDCが使用できない場合、エラーがクローンDCに記録されます。 | マスターDCリソースが使用可能かどうか、およびマスターDCに正しくパッチが適用されているかどうかを確認します。 |
OAMRE-07014、OAMRE-07015、OAMRE-07016 | マスターDCに不足しているエンティティがある場合、エラーが発生します。 | クローンDCからエンティティを削除します。 |
OAMRE-07017 | ソース・サーバー(マスターDC)設定が構成内に存在しない場合、エラーが発生します。 | エンティティのレプリケーションを確認するか、アクセス・ストアを再度インポートおよびエクスポートして、エンティティおよびランタイム・エンティティのレプリケーションをやり直してください。 |
OAMRE-07023 | ランタイム・エンティティ・レプリケーションが同期されておらず、レプリケーションのジャーナル・バックログがsourceDcJournalThresholdUpperLimit パラメータの値を超えている場合、エラーが発生します。
|
これは、ランタイム・エンティティ・レプリケーションが同期されると自動修正されます。
データを再度同期するには、アクセス・ストアを手動でインポートし、アクセス・ストアをエクスポートします。 |
クローン処理サーバー・レスポンスでエラーが発生しました。 | システム・プロパティprintEntitiesInRequest=true を設定して、HTTPリクエストおよびレスポンスのログを有効にします |
このプロパティを設定すると、リクエストおよびレスポンスのロギングが有効になります。 |
38.8 動的クライアント登録
動的クライアント登録(DCR)は、ネイティブ・モバイル・アプリケーション(Android)が自身をクライアントとしてOAuthサーバー(OAM)に動的に登録する方法を提供します。
この項では、OAuthサーバー(OAM)にクライアントを動的に登録する詳細な手順について説明します。
38.8.1 動的クライアント登録の有効化
動的クライアント登録(DCR)は、アイデンティティ・ドメイン・レベルで有効にする必要があります。
isDcrRegEnabled
をtrue
に設定して、アイデンティティ・ドメインを作成します。
ノート:
isDcrRegEnabled
フラグが指定されていないか、false
に設定されている場合、DCRは無効です。
curl -X POST \
http(s)://<Admin-Server-URL>:<Admin_Server_Port>/oam/services/rest/ssa/api/v1/oauthpolicyadmin/oauthidentitydomain \
-H 'authorization: Basic d2VibG9naWM6d2VsY29tZTE=' \
-H 'cache-control: no-cache' \
-H 'content-type: application/json' \
-d '{"name":"dcr_domain","enableMultipleResourceServer":false,"description":"DCR Domain",
"tokenSettings":[{"refreshTokenEnabled":true,"refreshTokenLifeCycleEnabled":true,"refreshTokenExpiry":5400,
"lifeCycleEnabled":true,"tokenType":"ACCESS_TOKEN","tokenExpiry":1800},
{"refreshTokenEnabled":true,"refreshTokenLifeCycleEnabled":true,"refreshTokenExpiry":10800,
"lifeCycleEnabled":true,"tokenType":"AUTHZ_CODE","tokenExpiry":240}],
"customAttrs":"{\"isDcrRegEnabled\":\"true\"}"
}'
38.8.2 OAuthクライアント・テンプレートの作成
OAuthクライアント・テンプレートは、実際のクライアントを作成するためのブループリントとして機能します。
次に示すように、管理サーバーのOAuth APIを使用して、OAuthクライアント・テンプレートを作成します。
curl -X POST \
http(s)://<AdminServerHost:Port>/oam/services/rest/ssa/api/v1/oauthpolicyadmin/client \
-H 'authorization: Basic d2VibG9naWM6d2VsY29tZTE=' \
-H 'cache-control: no-cache' \
-H 'content-type: application/json' \
-d '{"id":"DCR_REG_STUB_oma", "secret":"welcome1",
"redirectURIs": [{"url":"http://www.dcr.com/access","isHttps":"false"}],
"scopes":["dcrreg"],"grantTypes":["IMPLICIT"],"clientType":"PUBLIC_CLIENT","idDomain":"dcr_domain",
"description":"dcr client for acme app registration","name":"DCR_REG_STUB_acme","defaultScope":"dcrreg"}'
表38-3 OAuthクライアント・テンプレートを作成するための必須プロパティと値
プロパティ | 値 |
---|---|
grantTypes | IMPLICIT 。
|
clientType | PUBLIC_CLIENT |
idDomain | 実際のクライアントを作成する必要があるドメインと同じにする必要があります。 |
name | DCR_REG_STUB_ を接頭辞として付ける必要があります。
ノート: 接頭辞は、通常のクライアント名には使用できません。 |
defaultScope | dcrreg ノート: スコープ・フィールドに格納できるスコープは1つのみで、その値はdcrreg にする必要があります。
|
redirectURIs | 実際のクライアントに必要なURIを指定します。
ノート: redirectURIの値は、実際のクライアントに自動的に割り当てられます。 |
38.8.3 登録トークンの取得
OAuthサーバー(OAM)に動的に登録する必要のあるモバイル・デバイス・アプリケーションは、最初に登録トークンを取得する必要があります。
登録トークンを取得するプロセス・フロー
- ユーザーがモバイル・デバイスでネイティブ・アプリケーションを開きます
- ネイティブ・アプリケーションに「登録」ボタンが表示されます
- ユーザーが「登録」ボタンをクリックすると、登録トークンURIを使用してブラウザが起動されます。OAuthサーバーへのリクエストには、
domain_name
およびtemplate_id
が含まれます。 - ユーザーは、構成されている認証ポリシーに基づいて、ログイン・フォームにリダイレクトされます。
- 認証に成功すると、OAuthサーバーによって登録トークンが生成され、この登録トークンがリクエストに基づいてトークンまたはQRコードとして返されます。
- ネイティブ・アプリケーションは、この登録トークンを使用して、クライアントの登録を続行できます。
図38-1 登録トークンを取得するためのフロー図
![登録トークンを取得するためのフロー図 登録トークンを取得するためのフロー図](img/registration_token_flow.png)
登録トークンのサンプル・リクエスト
モバイル・デバイスでユーザー(またはリソース所有者)がアプリケーションを開いたら、アプリケーションは、/dcr/token
エンドポイントを指定してGET
リクエストをOAuthサーバー(OAM)に送信する必要があります。/dcr/tokenエンドポイントは保護されている必要があります。
次に、リクエストのサンプルを示します
GET http(s)://<server-host>:<server-port>/oauth2/rest/dcr/token?domain=dcr_domain&template_id=DCR_REG_STUB_acme&response_type=token
domain | クライアントを登録する必要があるドメインの名前。 |
template_id | OAuthクライアント・テンプレートID |
response_type | レスポンス・タイプは次のいずれかです:
|
表38-4 登録トークンのサンプル・レスポンス
構成 | サンプル・レスポンス |
---|---|
リダイレクトURIがクライアント・テンプレートで定義されています。 この場合、 |
|
リダイレクトURIは存在せず、response_type は渡されないか、トークンとして渡されます。
|
|
リダイレクトURIは存在せず、response_type がQRコードとして渡されます
|
|
表38-5 登録トークンのエラー・レスポンス
シナリオ | HTTPステータス・コード | エラー・メッセージ | セカンダリ・メッセージ |
---|---|---|---|
OAuthサービスが無効 | 403 | Unauthorized | Unauthorized |
動的クライアント登録が無効 | 403 | Unauthorized | Unauthorized |
必須フィールドが未入力 | 400 | Invalid Request | Required fields are missing |
無効なドメイン | 400 | Invalid Request | Invalid Domain |
無効なクライアント:
|
400 | Invalid Request | Invalid Client |
無効なレスポンス・タイプ | 400 | Invalid Request | Unsupported Response Type |
渡されたクライアントにDCRフローを実行する権限がない | 403 | UnAuthorized Client | UnAuthorized client |
38.8.4 登録トークンを使用したクライアントの登録
登録トークンを使用して、クライアントをOAuthサーバー(OAM)に登録します。
クライアント登録のプロセス・フロー
- ネイティブ・アプリケーションは、クライアントを登録するために、登録トークンを含むリクエストをOAuthサーバーに送信します。
- OAuthサーバーは、トークンを検証してクライアントを登録します。クライアント・プロファイルには次のフィールドがあります:
client_id 自動生成 client_secret 自動生成 client_name 自動生成 権限タイプ クライアントが登録される権限タイプは、Authorization_CodeおよびRefresh_tokenのみです。 スコープ/デフォルト・スコープ dcrread
は、クライアント・プロファイルに追加される唯一のスコープです。これはdefaultScopeでもあります。redirect_uris クライアント・テンプレートから導出されます。 クライアント・タイプ デフォルトでは、モバイル/ネイティブ・クライアントとして割り当てられます トークン属性 クライアント・テンプレートから導出されます。
図38-2 クライアント登録のフロー図
![クライアント登録のフロー図 クライアント登録のフロー図](img/dcr_flow.png)
クライアント登録のサンプル・リクエスト
クライアントとして登録するには、アプリケーションで/dcr/client
を指定してPOST
メソッドを使用する必要があります。
POST /oauth2/rest/dcr/client HTTP/1.1
Host: <OAuth Server host-name>:<OAuth server port name>
Content-Type: <can be any valid value as there is no input>
X-OAUTH-IDENTITY-DOMAIN-NAME: dcr_domain
Authorization: Bearer eyJraWQiOi.abcdsfsdfr.ascsfsdff
X-OAUTH-IDENTITY-DOMAIN-NAME | クライアントが作成される必要のあるアイデンティティ・ドメインの名前。この値は、トークンの取得時に指定したドメイン名と同じにする必要があり、異なる場合、リクエストは失敗します。 |
Authorization | 登録トークンは、ベアラー・トークンとして指定します。 |
クライアント登録のサンプル・レスポンス
HTTP/1.1 201 Created
Content-Type: application/json
Cache-Control: no-cache
Pragma: no-cache
{
"client_id": "cd885f3da58f498e830c4f636636dd23",
"client_secret": "gjDmqUVW1k",
"client_name": "oma498e830c4f636636dd23",
"redirect_uris": [
"app://callBack"
],
"client_secret_expires_at": 0,
"client_get_uri": "http(s)://<host>:<port>/oauth2/dcr/client?client_id=<id of created client>"
}
表38-6 クライアント登録のエラー・レスポンス
シナリオ | HTTPステータス・コード | エラー・メッセージ | セカンダリ・メッセージ |
---|---|---|---|
OAuthサービスが無効 | 403 | Unauthorized | Unauthorized |
動的クライアント登録が無効 | 403 | Unauthorized | Unauthorized |
必須フィールドが未入力 | 400 | Invalid Request | Required fields are missing |
無効なドメイン | 400 | Invalid Request | Invalid Domain |
無効なトークン | 401 | Unauthorized | Access token is {0} , where {0} could be:
|
サーバーで失敗 | 500 | Internal Server Error | 不具合の詳細なエラー・メッセージ |
クライアントはすでに存在します | 409 | Client already exists | Client already exists |
38.8.5 クライアント詳細の読取り
読取りAPIは、OAuthを使用して保護されます。この項では、クライアント情報の読取り方法について説明します。
次のサンプル・リクエストに示すように、scope=dcrread
を使用して、読み取る必要のあるクライアントの認可コードを生成します。
http(s)://<server-host>:<server-port>/oauth2/rest/authz?response_type=code&client_id=cd885f3da58f498e830c4f636636dd23&domain=dcr_domain
&scope=dcrread&state=xyz&redirect_uri=http://www.dcr.com/access
この認可コードを、/oauth2/rest/token
エンドポイントを指定してPOST
メソッドに渡し、scope=dcrread
のアクセス・トークンを生成します。
/dcr/client
エンドポイントを指定し、GET
メソッドを使用して、このアクセス・トークンをベアラー・アクセス・トークンとして渡し、クライアントを読み取ります。
クライアント詳細を取得するためのサンプル・リクエスト
GET /oauth2/rest/dcr/client/cd885f3da58f498e830c4f636636dd23 HTTP/1.1
Host: <OAuth Server host-name>:<OAuth server port name>
Content-Type: <can be any valid value as there is no input>
X-OAUTH-IDENTITY-DOMAIN-NAME: dcr_domain
Authorization: Bearer <Access token>
{
"client_id": "cd885f3da58f498e830c4f636636dd23",
"domain": "domainName",
"client_name": "oma498e830c4f636636dd23",
"redirect_uris": [
"http://www.dcr.com/access", "other redirect URI"
]
}
38.8.6 動的に登録されたクライアントの削除
この項では、動的に登録されたクライアントの削除方法について詳しく説明します。
次のサンプル・リクエストに示すように、scope=dcrdel
を使用して、削除する必要のあるクライアントの認可コードを生成します。
http(s)://<server-host>:<server-port>/oauth2/rest/authz?response_type=code&client_id=cd885f3da58f498e830c4f636636dd23&domain=dcr_domain
&scope=dcrdel&state=xyz&redirect_uri=http://www.dcr.com/access
この認可コードを、/oauth2/rest/token
エンドポイントを指定してPOST
メソッドに渡し、scope=dcrdelのアクセス・トークンを生成します。
/dcr/client
エンドポイントを指定し、DELETE
メソッドを使用して、このアクセス・トークンをベアラー・アクセス・トークンとして渡し、クライアントを削除します。GET /oauth2/rest/dcr/client/cd885f3da58f498e830c4f636636dd23 HTTP/1.1
Host: <OAuth Server host-name>:<OAuth server port name>
Content-Type: <can be any valid value as there is no input>
X-OAUTH-IDENTITY-DOMAIN-NAME: dcr_domain
Authorization: Bearer <Access token>
38.9 OAuthトークンに対するSSOセッションのリンク
いくつかのリソースがOAMで保護される一方で、一部がOAuthによってアクセスされるデプロイメント・シナリオにおいて、様々に混在するアプリケーション間でシームレスなSSOを実現するには、SSOセッションをアクセス・トークンにリンクする必要があります。OAuthトークンに対するSSOセッションのリンクでは、ネイティブ・モバイル・アプリケーションおよびOAuthトークンとSSOトークンの同期が含まれる2-leggedフローを必要とするキーOAuthデプロイメントがサポートされます。
ユースケース・フロー
図38-3に、SSOセッションのリンクのユースケース・フローを示します。
SSOセッションのリンクのためのサーバー変更
-
SSOセッションが作成されると、JWTユーザー・トークンも作成されます。JWTユーザー・トークンには、その要求の一部としてSSO "session_id"が含まれます。
-
このJWTトークンの作成は、構成に基づきます。作成したら、このトークンは、Cookieまたはヘッダーとしてダウンストリーム・アプリケーションに送信できます。現在、構成は、スキーム・レベルのチャレンジ・パラメータとして設定されます。
デフォルトでは、SSOリンクJWTトークンはCookieで設定されます。ノート:
OAUTH_TOKEN_RESPONSE_TYPE
がheader
の場合、JWTトークンはCookie名JWTAssertion
で設定されます。OAUTH_TOKEN_RESPONSE_TYPE
がcookie
の場合、JWTトークンはCookie名OAUTH_TOKEN
で設定されます。
図ssolink_challengparam.pngの説明 -
トークン署名: 起動時に、デフォルトのOAuthキー証明書がサーバーにブートストラップされます。JWTトークンは、アイデンティティ・ドメインの秘密キーで署名されます。JWTトークンがアサーションとして受信されると、X5T値がヘッダーから取得され、トークンの検証に使用できる関連する公開キーがフェッチされます。
-
トークンがOAuthトークン・リクエストのJWTベアラー・フローの一部として戻されると、OAMサーバーは、トークンからSSO "session_id"を取得します。
-
有効なセッションのチェック: JWTトークンにセッションIDが含まれる場合、サーバーは、それをSSOのリンクしたJWTトークンであると認識します。それは、トークンから"sessionId"要求を取得し、指定されたIDを持つサーバー・セッションがまだ有効であるかどうかをチェックします。
-
セッションが有効な場合、SSOセッションのサブジェクトが、JWTトークンの"sub"フィールドと比較されます。これが一致した場合、このユーザーのアクセス・トークンが生成され、クライアントに返されます。
-
MDC対応環境の場合、JWTトークン作成の一環として、別の要求である"mdc_sso_link"もトークンに追加されます。この要求には、セッションが固定されているマシンのclusterIdと、UserIdentityStore参照が含まれます
-
トークンがOAuthトークン・リクエストのJWTベアラー・フローの一部として戻されると、OAMサーバーは、トークンからSSOセッションIDを取得します。
-
有効なセッションのチェック: JWTトークンにセッションIDが含まれる場合、サーバーは、それをSSOのリンクしたJWTトークンであると認識します。それは、トークンから"sessionId"要求を、mdc_sso_link要求からclusteridを取得し、セッションを取得します。セッションの有効性をチェックする通常のMDCフローは、ここで維持されます。
-
セッションが有効な場合、SSOセッションのサブジェクトが、JWTトークンの"sub"フィールドと比較されます。これが一致した場合、このユーザーのアクセス・トークンが生成され、クライアントに返されます。
セッションが15分(構成値)を超えてアイドル状態の場合に、このJWTトークンの有効性をチェックすると、失敗します。これにより、セッションのルールがOAuthアクセス・トークンにも適用されることが保証されます。
38.10 OAuth 12cのランタイムREST API
OAuthのランタイムREST APIでは、新しい12c OAuthサーバーで2-leggedおよび3-leggedのOAuthサービス・フローのRESTコールが提供されます。これらの項では、リソース・アクセス・トークンの取得方法を示すRESTリクエストのサンプルについて説明します。
アクセス・トークンの作成
http://<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token
-
リソース所有者の資格証明の使用
次に、サーバーに対するサンプル・リクエストを示します。
curl -i -H 'Authorization: Basic U1NPTGlua0NsaWVudDp3ZWxjb21lMQ==' -H "Content-Type: application/x-www-form-urlencoded;charset=UTF-8" -H "X-OAUTH-IDENTITY-DOMAIN-NAME: SSOLink" --request POST http://<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token -d 'grant_type=PASSWORD&username=weblogic&password=welcome1&scope=SSOLink.link1'
ノート:
すべてのリクエストに関連するヘッダー-
Authorization: Base64 URLエンコードClientID:秘密の組合せ。
-
X-OAUTH-IDENTITY-DOMAIN-NAME
: クライアントが属しているアイデンティティ・ドメイン。 -
12.2.1.4.5以降では、アイデンティティ・ドメインはヘッダー・パラメータ
X-OAUTH-IDENTITY-DOMAIN-NAME
のかわりに問合せパラメータidentityDomain
として指定できます。
-
-
クライアント資格証明の使用
次に、サーバーに対するサンプル・リクエストを示します。
curl -i -H 'Authorization: Basic U1NPTGlua0NsaWVudDp3ZWxjb21lMQ==' -H "Content-Type: application/x-www-form-urlencoded;charset=UTF-8" -H "X-OAUTH-IDENTITY-DOMAIN-NAME: SSOLink" --request POST http://<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token -d 'grant_type=CLIENT_CREDENTIALS&scope=SSOLink.link1'
-
JWTベアラー・トークンの使用
次に、サーバーに対するサンプル・リクエストを示します。
curl -i -H 'Authorization: Basic U1NPTGlua0NsaWVudDp3ZWxjb21lMQ==' -H "Content-Type: application/x-www-form-urlencoded;charset=UTF-8" -H "X-OAUTH-IDENTITY-DOMAIN-NAME: SSOLink" -- request POST http://<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token -d 'grant_type=JWT_BEARER&scope=SSOLink.link1&assertion=<assertion token value>'
-
JWTベアラー・フローを使用したUserInfoエンドポイント経由のユーザー・データの取得
/UserInfo
エンドポイント経由でユーザー・データをフェッチするために、JWTベアラー・フローから取得したアクセス・トークンが必要な場合、次のスコープをクライアントに割り当てて、実行時にリクエストする必要があります。スコープ 対応するOpenIDスコープ UserInfo.email openid email UserInfo.me (デフォルト) openid (ユーザー名を返します)
UserInfo.address openid address UserInfo.phone openid phone UserInfo.profile openid profile クライアント・プロファイル
次に、UserInfo関連のスコープが登録されているクライアント・プロファイルの例を示します。
curl -X POST \ http://<AdminServerHost:Port>/oam/services/rest/ssa/api/v1/oauthpolicyadmin/client \ -H 'Authorization: Basic d2VibG9naWM6d2VsY29tZTE=' \ -H 'Content-Type: application/json' \ -d '{"attributes":[{"attrName":"UserAttr","attrValue":"CustomStaticValue","attrType":"STATIC"}, {"attrName":"ResServerConstAttr","attrValue":"Overriding client - static attribute","attrType":"STATIC"}], "secret":"welcome1","id":"DemoClientID","scopes":["UserInfo.address", "UserInfo.email"],"clientType":"CONFIDENTIAL_CLIENT","idDomain":"DemoDomain","description":"Client Description","name":"DemoClient","grantTypes":["JWT_BEARER"],"defaultScope":"UserInfo.email","redirectURIs":[{"url":"http://localhost:8080/Sample.jsp","isHttps":true}]}'
例
次に、トークン・リクエストの例を示します。
curl -i -H 'Authorization: Basic U1NPTGlua0NsaWVudDp3ZWxjb21lMQ==' -H "Content- Type: application/x-www-form-urlencoded;charset=UTF-8" -H "X-OAUTH-IDENTITY- DOMAIN-NAME: SSOLink" -- request POST http://<ManagedServerHost:ManagedServerPort>/oauth2/rest/token - d 'grant_type=JWT_BEARER&scope=UserInfo.email UserInfo.address&assertion=assertion token value'
-
-
リフレッシュ・トークンの使用
次に、サーバーに対するサンプル・リクエストを示します。
curl -i -H 'Authorization: Basic U1NPTGlua0NsaWVudDp3ZWxjb21lMQ==' -H "Content-Type: application/x-www-form-urlencoded;charset=UTF-8" -H "X-OAUTH-IDENTITY-DOMAIN-NAME: SSOLink" --request POST http://<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token -d 'grant_type=REFRESH_TOKEN&scope=SSOLink.link1&refresh_token=<RefreshTokenValue>'
-
JWTを含むリソース所有者の資格証明の使用 - クライアント・アサーション・トークン
次に、サーバーに対するサンプル・リクエストを示します。
curl -i -H "Content-Type: application/x-www-form-urlencoded;charset=UTF-8" -H "X-OAUTH-IDENTITY-DOMAIN-NAME: SSOLink" --request POST http://<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token -d 'grant_type=PASSWORD&scope=SSOLink.link1&client_assertion=<ClientAssertionTokenValue>&client_assertion_type=JWT_BEARER&username=weblogic&password=welcome1'
ノート:
-
client_assertion_typeに使用できる値は、JWT_BEARERおよびurn:ietf:params:oauth:client-assertion-type:jwt-bearerです
-
redirect_uriは、2-leggedフロー用ではありません。
-
scopeは、2-leggedフローのオプションです。指定しない場合、クライアントに関連する(クライアントの登録中に指定された) defaultScopeを使用してアクセス・トークンが生成されます。
3-leggedフローを実現するためには、続行する前にOAMサーバーとWebゲートの両方でいくつかの手動ステップを実行する必要があります。承認ページと承認者ページは、OAMを使用して保護する必要があります。承認ページをカスタマイズする場合、Webゲートで保護する必要があります。
-
OAMサーバー - 作成されたアプリケーション・ドメインで、指定されたステップの説明に従っていくつかの3-leggedリソースを追加する必要があります。
-
Webゲート - この項の説明に従ってmod_wl_ohs.confを変更します。
OAMサーバー側で実行するステップ
-
3-leggedの設定の一環として追加するすべてのリソースのリスト。それぞれのリソースの詳細は、ステップ2を参照してください。
図all_resources.pngの説明 -
リソース"/oauth2/rest/approval"を作成します。これは、Webゲートで保護する必要があります。
図3legged11.pngの説明 -
リソース"/oauth2/rest/approval/skip"を作成します。これは、Webゲートで保護する必要があります。
-
即時利用可能な承認ページであるリソース"/oam/pages/consent.jsp"を作成します。カスタム承認ページを使用する場合、それはWebゲートで保護し、ここで適切なリソースを追加する必要があります。
図consent_resource.pngの説明 -
リソース"/oauth2/rest/**"を作成し、「保護レベル」を
「除外」
としてマークします。
図3legged3.pngの説明 -
リソース"/oam/**"を作成し、「保護レベル」を
「除外」
としてマークします。
図oam_resource.pngの説明
Webゲート側で実行するステップ
<OHS_HOME>/user_projects/domains/base_domain/config/fmwconfig/components/OHS/<ohs instance name>
の場所にあるmod_wl_ohs.confファイルを開いて更新し、次のエントリを追加します。
<Location /oauth2> SetHandler weblogic-handler WebLogicHost <Managed Server Host Name> WebLogicPort <Managed Server Port> ErrorPage http:/WEBLOGIC_HOME:WEBLOGIC_PORT/ </Location> <Location /oam> SetHandler weblogic-handler WebLogicHost <Managed Server Host Name> WebLogicPort <Managed Server Port> ErrorPage http:/WEBLOGIC_HOME:WEBLOGIC_PORT/ </Location>
3-leggedフロー
-
ブラウザ・リクエストの認可コードの使用
次に、サーバーに対するサンプル・リクエストを示します
http://<OHS Hostname>:<OHS Port>/oauth2/rest/authz?response_type=code&client_id=TestClient2&domain=TestDomain1&scope=TestRS.scope1+TestRS.scope2+TestRS.scope3&state=xyz&redirect_uri=http://localhost:8080/SampleTest/index.jsp
-
認可コードを使用したアクセス・トークンの生成
次に、サーバーに対するサンプル・リクエストを示します
curl --request POST \ --url http://<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token --header 'authorization: Basic U1NPTGlua0NsaWVudDp3ZWxjb21lMQ==' --header 'cache-control: no-cache' --header 'content-type: application/x-www-form-urlencoded' --header 'x-oauth-identity-domain-name: SSOLink' --data grant_type=AUTHORIZATION_CODE&code=bnAreDZVMUxEemZtZmJPUEE2U1N2QT09fmVBUVJZYnFtYmZFSU1EaUFpSktvQjVwQ0ZGQm4xV1R4dmJrekp0MTdDZXdPYjJFNjEwVkdhZlN3VWJjTWcvRUpwL3RqWERUZWliZWdUSzZPQkxQNktwQk03c0ZKMEV1NmN3SmxwbGl5b1U4MnZ6S1pXRFB6ekdiU1k3V3FEZ3lLSjgxM0NwUGNwUjk1eXI5enRKb0ZLb1VVZ0hqNm53TkVFTEpKMmtKNmY3b1ZHWDFtcFkvL1haMUs4N0xiRGlnbkFwTWpHd1J5QjVuZkdxTzh4U01hamdWZnNmT3doSlo1SS9KY3NtOGNaQkJxMDd3SzgrWXBIcVYxYlgxYzFLSWhubW5MWndZQTg5ZnV0aU1Kam54bytZaGZhbW5IK2xrNjFBYVhxOHB5SEdENG5SRzJ2aytDcjRHR1g2OWZFbTdT&redirect_uri=http%3A%2F%2Fredirect_uri'
アクセス・トークンの検証
curl -i -H "X-OAUTH-IDENTITY-DOMAIN-NAME: SSOLink" --request GET "http://<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token/info?access_token=<AccessToken>"
38.11 OAuthトークンの取消し
OAMには、OAuthのアクセス・トークンとリフレッシュ・トークンを取り消すためのランタイムREST APIおよび管理者REST APIが用意されています。
38.11.1 OAuthクライアントによるOAuthトークンの取消し
OAMでは、http://<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token/revoke
ランタイムREST APIを使用してアクセス・トークンとリフレッシュ・トークンを取り消すOAuthクライアントにサポートが提供されます。
- OAMによってトークンの取消しがサポートされるのは、3-leggedのOAuthフロー(認可コード・フロー)を介して生成されたアクセス・トークンとリフレッシュ・トークンのみです。
2-leggedのOAuthフローを介して生成されたトークンの場合、ユーザーの承認はなく、トークンの再生成に必要なすべての情報がクライアントにあります。クライアントが危険にさらされた場合は、そのクライアントを削除することをお勧めします。
2-leggedのOAuthフローによって生成されたトークンをリクエストに指定すると、OAMによってRESPONSE CODE: 415というエラーが返されます{"error": "unsupported_token_type","error_description": "Revocation of the presented token type not supported."}
- OAuthトークンの取消しを行えるようにするには、承認管理を有効にする必要があります。有効になっていない場合、OAMはエラーRESPONSE CODE: 500を返します
{ "error": "token_revocation_without_cmlc_not_supported", "error_description": "Consent management must be enabled for TOKEN REVOCATION support" }
承認管理を有効にする方法の詳細は、「承認管理の有効化」を参照してください
MDC設定で承認管理を有効にする方法の詳細は、「MDCでの承認管理の有効化」を参照してください
- MDC設定で、OAuthトークンの取消しがすべてのデータ・センターに伝播されるまでにかかる時間は、
pollInterval
に設定された値で決まります。推奨値は5
秒です。つまり、1つのデータ・センターのOAuthトークンをクライアントが取り消した場合、その変更がMDCトポロジの他のデータ・センターに伝播されるまでに少なくとも5秒かかります。pollInterval
の変更の詳細は、「クローン・データ・センターでのポーリング間隔の変更」を参照してくださいまた、
BatchSize
を300
に設定することもお薦めします。詳細は、 表19-2を参照してください
Authorization
: Base64 URLエンコードの<ClientID>:<Secret>
の組合せ。X-OAUTH-IDENTITY-DOMAIN-NAME
: クライアントが属しているアイデンティティ・ドメイン。Content-Type: application/x-www-form-urlencoded
:token
は、リクエスト本文でキーと値のペアとして提供されます。
パラメータ、レスポンス・コード、エラー・コードなどの詳細は、トークン取消しRESTエンドポイントに関するREST APIドキュメントを参照してください。
特定のアクセス・トークンまたはリフレッシュ・トークンの取消し
OAuthクライアントは、http://<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token/revoke
APIを使用して、特定のアクセス・トークンまたはリフレッシュ・トークンを取り消すことができます。
OAMでは、RFC 7009の定義に従ってトークンの取消しが実装されています。詳細は、https://tools.ietf.org/html/rfc7009を参照してください。
curl --location --request POST '<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token/revoke' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'x-oauth-identity-domain-name: DemoDomain' \
--header 'Authorization: Basic RGVtb0NsaWVudElkOndlbGNvbWUx' \
--header 'Cookie: JSESSIONID=VKgaCGYiIiQ_3-gTdIOymIqW4uMXGt2OPNglGjTvJUaVyP4gkNY3!-472705583' \
--data-urlencode 'token=eyJraWQiOiJEZW1vRG9tYWluIiwieDV0IjoiZG1HQi1zR1BlcHEzblE2ZWdyRnNkM3c4ZU9
JIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJodHRwOi8vc2xjMDdoYWYudXMub3JhY2xlLmNvbToyMjIyL29hdXRoMiIsImF1
ZCI6WyJEZW1vUmVzU2VydmVyIiwiYWIwIl0sImV4cCI6MTYxNTM1MDY3NywianRpIjoiX3BDeGRpdkNkc0F3Q2JvcHY2OHoz
USIsImlhdCI6MTYxNTM0NzA3Nywic3ViIjoidXNlckEiLCJjdXN0b21BdHRyaXNlc3Npb25JZCI6IjM4M2E0YjA3LTg4NWUt
NGIxYy05MzZhLWRjYTVlYzlmOGMyZnwvSDZ2OHZJc0NZaUR1T3l1MFN0RHVnUE1rdXQ1VUxVSUtQZGZpait0ejhnPSIsIm1k
Y19zc29fbGluayI6Ijk2YmJjLXNsYzA3aGFmLnV-flVzZXJJZGVudGl0eVN0b3JlMSIsImN1c3RvbUF0dHJpMiI6IlJFU09V
UkNFQ09OU1QiLCJjbGllbnQiOiJEZW1vQ2xpZW50SWQiLCJzY29wZSI6WyJEZW1vUmVzU2VydmVyLkRlZmF1bHRTY29wZSJd
LCJkb21haW4iOiJEZW1vRG9tYWluIiwiZ3JhbnQiOiJBVVRIT1JJWkFUSU9OX0NPREUifQ.byPaJjUfH2Pi9ipTKIaAAB5CP
B5lwLd8ga_39ruDQEfckqYcgHAToTQfFn6uibbEn0EluxJqE_rnT6ABLWQ0VABruMRRiK2fcE7qGSSWXdakjjWmYG4pVJTgN
64OrEroUPM-65ZvqIDmMiYG-80dVJpQq3QxG9_7yJhG0g8Rf1cxGITJb2_RLnl9Ke1Wmex5LcMKRGGhiezA98o_jluknmzdUi
Pw1C2NGxXESvTgMnM7Q49exnG1py-aZ7KaohF8misS2_Hbgx4f-2ipG8CQtefiwCEDvPpk30QGKuU4GGmV9yUlV3qd-yqJTUA
4EbvffsNeadSjhsov3Sjw8ZNq1g'
{
"status": "success"
}
関連する承認、アクセス・トークンまたはリフレッシュ・トークンの取消し
リフレッシュ・トークンがアクセス・トークンとともに3-leggedのOAuthフローで作成された場合、そのリフレッシュ・トークンを使用して、リフレッシュ・トークンが有効になるまでアクセス・トークンを何回も生成できます。詳細は、「OAuthリフレッシュ・トークン」を参照してください
そのような関連するすべてのリフレッシュ・トークンとアクセス・トークンを取り消すために、OAuthクライアントは、さらにchaining_level
パラメータをtoken
パラメータと一緒にhttp://<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token/revoke
APIで使用することもできます。
chaining_level
パラメータでサポートされる値および対応する動作を示しています。
ノート:
token
パラメータは必須ですが、token_type
はオプションです。トークン・タイプは、token
パラメータで指定されたトークンに基づいて決定されます。
表38-7 chaining_levelの値と動作
指定されたトークンのタイプ | chaining_levelの値 | 動作 |
---|---|---|
リフレッシュ・トークン | NONE | デフォルト。token パラメータで指定されたリフレッシュ・トークンが取り消されます。
|
RELATED_TOKENS | token パラメータで指定されたリフレッシュ・トークンに加えて、そのリフレッシュ・トークンによって生成されたすべてのアクセス・トークンが取り消されます。
|
|
RELATED_CONSENT | 承認が削除されます。token パラメータで指定されたリフレッシュ・トークンに加えて、付与/承認(指定されたリフレッシュ・トークンに関連付けられている)によって作成されたすべてのアクセス・トークンとリフレッシュ・トークンが取り消されます。
|
|
アクセス・トークン | NONE | デフォルト。token パラメータで指定されたアクセス・トークンが取り消されます。
|
RELATED_TOKENS | token パラメータで指定されたアクセス・トークンに加えて、親リフレッシュ・トークン(指定されたアクセス・トークンの生成に使用された)が取り消されます。
|
|
RELATED_CONSENT | 承認が削除されます。token パラメータで指定されたアクセス・トークンに加えて、付与/承認(指定されたアクセス・トークンに関連付けられている)によって作成されたすべてのアクセス・トークンとリフレッシュ・トークンが取り消されます。
|
次に、リフレッシュ・トークンと、そのリフレッシュ・トークンを使用して生成されたアクセス・トークンを取り消すサンプル・リクエストを示します。
curl --location --request POST '<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token/revoke' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'x-oauth-identity-domain-name: DemoDomain' \
--header 'Authorization: Basic RGVtb0NsaWVudElkOndlbGNvbWUx' \
--header 'Cookie: JSESSIONID=NysahaoNLyc13HzjEh93gJmwbY4HnMetJQY33RE8_ZdBpzpw7kdr!-472705583' \
--data-urlencode 'token=LCbzQggeRM1EMgprtKrHuQ%3D%3D%7EcsLp2lL9J03orCX0dTvBySFAXG4Yi%2BI%2FOq80
ChZzVsz1BrME2GEg9Kuk6aShduv0K%2F8Yzhs6F4RCOdXgO1uZi1u3V544Hf%2FziaoJFZGDr4UmfkLHByMTJYWTJXfR%2F
MUQkkDjffRAlox1vVjztUbhB1uKMkZWE%2FhTYHCp1pkc2zNJC7j7KQaIF%2BkNfg8GPS%2FdjeLo7i99%2B%2Bifb%2BKq
GTnaJWOr2JSm7XApoGlX9dwBzM8EHdO4IQNPYDxkvtQLajVxlRhK5ZnL3F29wBD4yOuXqg%3D%3D' \
--data-urlencode 'chaining_value=RELATED_TOKENS' \
--data-urlencode 'token_type=REFRESH_TOKEN'
{
"status": "success"
}
次の例に示すのは、アクセス・トークンと、そのアクセス・トークンが生成された親リフレッシュ・トークンを取り消すサンプル・リクエストです。
curl --location --request POST '<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token/revoke' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'x-oauth-identity-domain-name: DemoDomain' \
--header 'Authorization: Basic RGVtb0NsaWVudElkOndlbGNvbWUx' \
--header 'Cookie: JSESSIONID=VKgaCGYiIiQ_3-gTdIOymIqW4uMXGt2OPNglGjTvJUaVyP4gkNY3!-472705583' \
--data-urlencode 'token=eyJraWQiOiJEZW1vRG9tYWluIiwieDV0IjoiZG1HQi1zR1BlcHEzblE2ZWdyRnNkM3c4ZU9
JIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJodHRwOi8vc2xjMDdoYWYudXMub3JhY2xlLmNvbToyMjIyL29hdXRoMiIsImF1
ZCI6WyJEZW1vUmVzU2VydmVyIiwiYWIwIl0sImV4cCI6MTYxNTM1NTAwOSwianRpIjoiZVEtVHA1N3JUTHFUTktPaERybEpnd
yIsImlhdCI6MTYxNTM1MTQwOSwic3ViIjoidXNlckEiLCJjdXN0b21BdHRyaXNlc3Npb25JZCI6IjgxOWY5ODc0NDdjMGE1Mzg
3Mzk1Mjg5OWYzZjUzMTYzMmUxZjRlODI5ZTNmN2FmMjg2OWFhNWY5M2YyMmMyYzMiLCJjdXN0b21BdHRyaTIiOiJSRVNPVVJDR
UNPTlNUIiwiY2xpZW50IjoiRGVtb0NsaWVudElkIiwic2NvcGUiOlsiRGVtb1Jlc1NlcnZlci5EZWZhdWx0U2NvcGUiXSwiZG9
tYWluIjoiRGVtb0RvbWFpbiIsInJ0X2lkIjoiM2FmN2Q5NzEtYjAyZS00ZDI5LThlOTMtNWJhMTkzMGJkN2Y2LjE2MTUzNTEzN
jciLCJncmFudCI6IkFVVEhPUklaQVRJT05fQ09ERSJ9.HBtENqB6nIAUAlcft84o5_tSFiXP_E-tD7Ux6WyC_nO0D1m2x6l7sc
9oQO8ad1vgXV4KjSGSPnxL09pWLUPDxhwQqs15w_Py1q-SWQxrcpKqtCv-vdz_zCS3_uMsaOLQTQwYyj94tnS9TEWAkQtknDrV
4vOFhhDMVOOBPIo5h7BeDa9liSIhPjlB7wPAHJ2HX4rOhL5z2BfPS2v9QNUDuJbvKZl78BwHP80L8uDaSsh5a0XMcJGr1PQ9cd0
6bSWGTF3o9NBLWBiWnPTyq17XDxnr4rEcPrp3bV_iwuIvo0id91iu52L-NTAts0FzTv7gEz2d6lNMwgMAfBFQPWFYRQ' \
--data-urlencode 'chaining_value=RELATED_TOKENS' \
--data-urlencode 'token_type=ACCESS_TOKEN'
{
"status": "success"
}
次の例に示すのは、承認を削除して、指定したリフレッシュ・トークンに関連付けられた承認によって生成されたすべてのアクセス・トークンとリフレッシュ・トークンも取り消すサンプル・リクエストです。
curl --location --request POST '<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token/revoke' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'x-oauth-identity-domain-name: DemoDomain' \
--header 'Authorization: Basic RGVtb0NsaWVudElkOndlbGNvbWUx' \
--header 'Cookie: JSESSIONID=VKgaCGYiIiQ_3-gTdIOymIqW4uMXGt2OPNglGjTvJUaVyP4gkNY3!-472705583' \
--data-urlencode 'token=LCbzQggeRM1EMgprtKrHuQ%3D%3D%7EcsLp2lL9J03orCX0dTvBySFAXG4Yi%2BI%2FOq80
ChZzVsz1BrME2GEg9Kuk6aShduv0K%2F8Yzhs6F4RCOdXgO1uZi1u3V544Hf%2FziaoJFZGDr4UmfkLHByMTJYWTJXfR%2F
MUQkkDjffRAlox1vVjztUbhB1uKMkZWE%2FhTYHCp1pkc2zNJC7j7KQaIF%2BkNfg8GPS%2FdjeLo7i99%2B%2Bifb%2BKq
GTnaJWOr2JSm7XApoGlX9dwBzM8EHdO4IQNPYDxkvtQLajVxlRhK5ZnL3F29wBD4yOuXqg%3D%3D' \
--data-urlencode 'chaining_value=RELATED_CONSENT' \
--data-urlencode 'token_type=REFRESH_TOKEN'
{
"status": "success"
}
OAuthトークン取消しの検証
OAuthのトークン取消しAPIを実行した後、次の方法でトークンが正常に取り消されたかどうかを検証できます。
- リフレッシュ・トークンが取り消されたかどうかを確認するには、リフレッシュ・トークンを使用して新しいアクセス・トークンを生成します。リフレッシュ・トークンが正常に取り消された場合、アクセス・トークンの生成は失敗します。リフレッシュ・トークンがまだ有効な(取り消されていない)場合は、新しいアクセス・トークンが生成されます。
サンプル・リクエスト
curl --location --request POST '<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --header 'x-oauth-identity-domain-name: DemoDomain' \ --header 'Authorization: Basic RGVtb0NsaWVudElkOndlbGNvbWUx' \ --header 'Cookie: JSESSIONID=NysahaoNLyc13HzjEh93gJmwbY4HnMetJQY33RE8_ZdBpzpw7kdr!-472705583' \ --data-urlencode 'grant_type=REFRESH_TOKEN' \ --data-urlencode 'refresh_token=LCbzQggeRM1EMgprtKrHuQ%3D%3D%7EcsLp2lL9J03orCX0dTvBySFAXG4Yi%2BI%2FOq80 ChZzVsz1BrME2GEg9Kuk6aShduv0K%2F8Yzhs6F4RCOdXgO1uZi1u3V544Hf%2FziaoJFZGDr4UmfkLHByMTJYWTJXfR%2F MUQkkDjffRAlox1vVjztUbhB1uKMkZWE%2FhTYHCp1pkc2zNJC7j7KQaIF%2BkNfg8GPS%2FdjeLo7i99%2B%2Bifb%2BKq GTnaJWOr2JSm7XApoGlX9dwBzM8EHdO4IQNPYDxkvtQLajVxlRhK5ZnL3F29wBD4yOuXqg%3D%3D'
サンプル・レスポンス{ "error": "invalid_grant", "error_description": "Invalid Refresh Token" }
- アクセス・トークンが取り消されたかどうかを確認するには、
http://<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token/info
REST APIを使用します。サンプル・リクエストhttp://<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token/info curl --location --request POST '<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token/info' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --header 'x-oauth-identity-domain-name: DemoDomain' \ --header 'Cookie: JSESSIONID=VKgaCGYiIiQ_3-gTdIOymIqW4uMXGt2OPNglGjTvJUaVyP4gkNY3!-472705583' \ --data-urlencode 'access_token=token=eyJraWQiOiJEZW1vRG9tYWluIiwieDV0IjoiZG1HQi1zR1BlcHEzblE2ZWdyRnNkM3c4ZU9 JIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJodHRwOi8vc2xjMDdoYWYudXMub3JhY2xlLmNvbToyMjIyL29hdXRoMiIsImF1 ZCI6WyJEZW1vUmVzU2VydmVyIiwiYWIwIl0sImV4cCI6MTYxNTM1NTAwOSwianRpIjoiZVEtVHA1N3JUTHFUTktPaERybEpnd yIsImlhdCI6MTYxNTM1MTQwOSwic3ViIjoidXNlckEiLCJjdXN0b21BdHRyaXNlc3Npb25JZCI6IjgxOWY5ODc0NDdjMGE1Mzg 3Mzk1Mjg5OWYzZjUzMTYzMmUxZjRlODI5ZTNmN2FmMjg2OWFhNWY5M2YyMmMyYzMiLCJjdXN0b21BdHRyaTIiOiJSRVNPVVJDR UNPTlNUIiwiY2xpZW50IjoiRGVtb0NsaWVudElkIiwic2NvcGUiOlsiRGVtb1Jlc1NlcnZlci5EZWZhdWx0U2NvcGUiXSwiZG9 tYWluIjoiRGVtb0RvbWFpbiIsInJ0X2lkIjoiM2FmN2Q5NzEtYjAyZS00ZDI5LThlOTMtNWJhMTkzMGJkN2Y2LjE2MTUzNTEzN jciLCJncmFudCI6IkFVVEhPUklaQVRJT05fQ09ERSJ9.HBtENqB6nIAUAlcft84o5_tSFiXP_E-tD7Ux6WyC_nO0D1m2x6l7sc 9oQO8ad1vgXV4KjSGSPnxL09pWLUPDxhwQqs15w_Py1q-SWQxrcpKqtCv-vdz_zCS3_uMsaOLQTQwYyj94tnS9TEWAkQtknDrV 4vOFhhDMVOOBPIo5h7BeDa9liSIhPjlB7wPAHJ2HX4rOhL5z2BfPS2v9QNUDuJbvKZl78BwHP80L8uDaSsh5a0XMcJGr1PQ9cd0 6bSWGTF3o9NBLWBiWnPTyq17XDxnr4rEcPrp3bV_iwuIvo0id91iu52L-NTAts0FzTv7gEz2d6lNMwgMAfBFQPWFYRQ'
サンプル・レスポンス{ "error": "invalid_grant", "error_description": "Access Token Validation Failed" }
38.11.2 ユーザー、クライアントおよびリソース・サーバーのOAuthトークンの取消し
OAuthクライアントによるトークン取消しのためのランタイムAPIだけでなく、OAMには、特定のユーザーまたはユーザー、クライアント、リソース・サーバーの特定の組合せに対するすべての3-legged OAuthトークンの取消しをサポートする管理者APIも用意されています。
http://<AdminServerHost>:<AdminServerPort>/oam/services/rest/consent/revoke
REST APIを使用して、特定のユーザーまたはユーザー、クライアント、リソース・サーバーの特定の組合せについて、すべてのOAuthトークンを取り消します。
- OAMによってトークンの取消しがサポートされるのは、3-leggedのOAuthフロー(認可コード・フロー)を介して生成されたアクセス・トークンとリフレッシュ・トークンのみです。
2-leggedのOAuthフローを介して生成されたトークンの場合、ユーザーの承認はなく、トークンの再生成に必要なすべての情報がクライアントにあります。クライアントが危険にさらされた場合は、そのクライアントを削除することをお勧めします。
-
OAuthトークンの取消しを行えるようにするには、承認管理を有効にする必要があります。有効になっていない場合、OAMは空の承認を返します。
[]
承認管理を有効にする方法の詳細は、「承認管理の有効化」を参照してください
MDC設定で承認管理を有効にする方法の詳細は、「MDCでの承認管理の有効化」を参照してください
- MDC設定で、トークンの取消しがMDC設定のすべてのクローン・データ・センターに伝播されるまでにかかる時間は、
pollInterval
に設定された値で決まります。推奨値は5
秒です。つまり、マスター・データ・センターのOAuthトークンをクライアントが取り消した場合、その変更がMDCトポロジの他のクローン・データ・センターに伝播されるまでに少なくとも5秒かかります。pollInterval
の変更の詳細は、「クローン・データ・センターでのポーリング間隔の変更」を参照してくださいまた、
BatchSize
を300
に設定することもお薦めします。詳細は、 表19-2を参照してくださいMDC設定では、この管理者REST APIをマスター・ノードで実行する必要があります。
Authorization
: Base64 URLエンコードの<Administrator>:<Secret>
の組合せ。X-OAUTH-IDENTITY-DOMAIN-NAME
: アイデンティティ・ドメイン名。Content-Type: application/x-www-form-urlencoded
: 必要に応じて、次のパラメータをキーと値のペアとしてリクエスト本文に追加します。userId
必須。 revoke_type
オプション。サポートされる値: REFRESH_TOKENS
、ACCESS_TOKENS
、TOKENS
。このパラメータを指定しない場合、または値としてTOKENSを指定した場合は、すべてのアクセス・トークンおよびリフレッシュ・トークンが取り消されます。
timestamp
オプション。指定した場合、このタイムスタンプより前に発行されたトークンが取り消されます。 clientIdentifier
オプション。指定した場合、 resServerId
も指定する必要があります。resServerId
オプション。 clientIdentifier
を指定した場合に指定する必要があります。
ノート:
12.2.1.4.5以降では、アイデンティティ・ドメインはヘッダー・パラメータX-OAUTH-IDENTITY-DOMAIN-NAME
のかわりに問合せパラメータidentityDomain
として指定できます。
パラメータ、レスポンス・コード、エラー・コードなどの詳細は、トークン取消しRESTエンドポイントに関するREST APIドキュメントを参照してください。
例
例38-1 ユーザーのすべてのOAuthトークンの取消し
トークンを取り消す必要があるuserId
を指定します。
curl --location --request POST '<AdminServerHost>:<AdminServerPort>/oam/services/rest/consent/revoke' \
--header 'Authorization: Basic d2VibG9naWM6d2VsY29tZTE=' \
--header 'x-oauth-identity-domain-name: DemoDomain' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Cookie: JSESSIONID=yIwmL5y29hILQ44F1-yt0t78Lgw0OYNVY1Z_gaz4cqW8xS01ekuE!-1307751471' \
--data-urlencode 'userId=UserA'
{
"consents": [
{
"clientId": "DemoClientId",
"consentId": "30650989-8e53-3010-b06a-98b0ef42b65d",
"createTimeStamp": "Fri Mar 12 03:24:08 PST 2021",
"resourceId": "66ac1a16-ee37-4525-81f6-9062d69a743c",
"scopes": [
"DemoResServer.DefaultScope"
],
"tokenRevokeTimestamp": "TOKENS=2021-03-12T03:30:31-0800",
"valid": true
}
]
}
例38-2 クライアントのすべてのリフレッシュ・トークンの取消し
指定したクライアントのすべてのACCESS_TOKENSを取り消すには、userId
、revoke_type
、clientIdentifier
、resServerId
を指定します。
curl --location --request POST '<AdminServerHost>:<AdminServerPort>/oam/services/rest/consent/revoke' \
--header 'Authorization: Basic d2VibG9naWM6d2VsY29tZTE=' \
--header 'x-oauth-identity-domain-name: DemoDomain' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Cookie: JSESSIONID=yIwmL5y29hILQ44F1-yt0t78Lgw0OYNVY1Z_gaz4cqW8xS01ekuE!-1307751471' \
--data-urlencode 'userId=UserA' \
--data-urlencode 'revoke_type=REFRESH_TOKENS' \
--data-urlencode 'clientIdentifier=DemoClientId' \
--data-urlencode 'resServerId=66ac1a16-ee37-4525-81f6-9062d69a743c'
{
"consents": [
{
"clientId": "DemoClientId",
"consentId": "30650989-8e53-3010-b06a-98b0ef42b65d",
"createTimeStamp": "Fri Mar 12 03:55:31 PST 2021",
"resourceId": "66ac1a16-ee37-4525-81f6-9062d69a743c",
"scopes": [
"DemoResServer.DefaultScope"
],
"tokenRevokeTimestamp": "REFRESH_TOKENS=2021-03-12T03:56:49-0800",
"valid": true
}
]
}
例38-3 タイムスタンプに基づいたユーザーのリフレッシュ・トークンの取消し
timestamp
パラメータを使用して、指定したタイムスタンプより前に生成されたリフレッシュ・トークンを取り消します。
[yyyy]-[MM]-[dd]'T'[HH]:[mm]:[ss]Z
の形式でタイムスタンプを指定します。
Z
は、+/-HHmm形式でのUTCに対する時間オフセットです。数値で+0000
のように示されます。たとえば、標準時に対するニューヨークのUTCオフセットは-0500
と指定できます。yyyy
は年ですMM
は月ですdd
は日ですHH
は時ですmm
は分ですss
は秒です
次のサンプル・リクエストは、タイムスタンプ2021-03-09T15:30:33+0800
より前に生成されたUserA
のすべてのトークンを取り消します。
curl --location --request POST '<AdminServerHost>:<AdminServerPort>/oam/services/rest/consent/revoke' \
--header 'Authorization: Basic d2VibG9naWM6d2VsY29tZTE=' \
--header 'x-oauth-identity-domain-name: DemoDomain' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Cookie: JSESSIONID=NysahaoNLyc13HzjEh93gJmwbY4HnMetJQY33RE8_ZdBpzpw7kdr!-472705583' \
--data-urlencode 'userId=UserA' \
--data-urlencode 'revoke_type=REFRESH_TOKENS' \
--data-urlencode 'timestamp=2021-03-09T15:30:33+0800'
{
"consents": [
{
"clientId": "DemoClientId",
"consentId": "30650989-8e53-3010-b06a-98b0ef42b65d",
"createTimeStamp": "Tue Mar 09 21:12:06 PST 2021",
"resourceId": "66ac1a16-ee37-4525-81f6-9062d69a743c",
"scopes": [
"DemoResServer.DefaultScope"
],
"tokenRevokeTimestamp": "REFRESH_TOKENS=2021-03-08T23:30:33-0800",
"valid": true
}
]
}
38.12 クライアント認証の構成
この内容は、OAMバンドル・パッチ12.2.1.4.210920以降のリリースにのみ適用されます。
client_secret_basic
:認証にパスワードを使用します。private_key_jwt
: OAMは認証用のJWTトークンを生成します。tls_client_auth
: mTLSクライアント認証。self_signed_tls_client_auth
:自己署名されたmTLSクライアント認証。
38.12.1 クライアント認証用のアイデンティティ・ドメインの構成
https://<admin-host>:<admin-port>/oam/services/rest/ssa/api/v1/oauthpolicyadmin/oauthidentitydomain
REST APIの本文にプロパティを追加できます。PUT
メソッドを使用して、プロパティで既存のアイデンティティ・ドメインを更新します。
ノート:
プロパティの詳細は、アイデンティティ・ドメインRESTエンドポイントのドキュメントを参照してください。{
"tokenEndpointAuthMethodsSupported": [
"tls_client_auth",
"self_signed_tls_client_auth",
"private_key_jwt",
"client_secret_basic"
],
"issueTLSClientCertificateBoundAccessTokens":"true",
"tlsClientAuthSubjectDN":"CN=%CLIENT_ID_PLACEHOLDER%, OU=OAM, O=Oracle, L=BLR, ST=KA, C=IN"
}
ノート:
- アイデンティティ・ドメインの作成または変更時に、
%CLIENT_ID_PLACEHOLDER%
をクライアントIDに置換しないでください。OAMサーバーは、認証中に%CLIENT_ID_PLACEHOLDER%
を置き換えます。 client_secret _basic
認証方法を使用する場合は、OHSからWLSへのクライアント証明書の伝播を無効にする必要があります。これは、クライアント証明書が存在する場合、mTLS検証が自動的に行われるためです。- リクエストでクライアント証明書が送信されると、それが
tokenEndpointAuthMethodsSupported
リストに含まれているかどうかに関係なく、mTLSが適用されます。したがって、OAMでクライアント証明書が無視されるようにする場合は、証明書がOAMサーバーに渡されないようにOHS/LBRを構成する必要があります。
- mTLS認証方法:
tls_client_auth
およびself_signed_tls_client_auth
- JWTキー認証方法:
private_key_jwt
- クライアント・シークレット認証方法:
client_secret_basic
ノート:
クライアントにいずれかの認証方法の構成が含まれている場合は、その認証方法のみが使用されます。38.12.2 クライアント認証用のクライアントの構成
https://<admin-host>:<admin-port>/oam/services/rest/ssa/api/v1/oauthpolicyadmin/client
REST APIの本文にプロパティを追加できます。PUT
メソッドを使用して、プロパティで既存のクライアントを更新します。
ノート:
プロパティの詳細は、クライアントRESTエンドポイントのドキュメントを参照してください。{
"tokenEndpointAuthMethod":"tls_client_auth",
"issueTLSClientCertificateBoundAccessTokens":"true",
"tlsClientAuthSubjectDN":"C=IN, ST=KA, L=BLR, O=Oracle, OU=OAM, CN=client2, EMAILADDRESS=client2@oracle.com"
}
ノート:
tlsClientAuthSubjectDN
値がクライアント証明書の値と一致していることを確認します。
クライアント構成では、認証方法はオプションです。クライアントで認証方法が指定されていない場合は、ドメイン・レベルの構成が使用されます。詳細は、rfc6749を参照してください
38.12.3 クライアント証明書の管理
CONFIDENTIAL_CLIENT
の場合(これは、クライアントの作成時にパラメータclientType
を使用して設定されます。詳細は、REST APIのドキュメントを参照してください)、CA証明書と中間CA証明書のみをOAMトラストストアに追加する必要があります。
PUBLIC_CLIENT
または自己署名クライアント証明書の場合は、クライアント証明書もクライアントに含まれている必要があります。クライアントにクライアント証明書を追加するには、https://<admin-host>:<admin-port>/oam/services/rest/ssa/api/v1/oauthpolicyadmin/clientartifacts
REST APIを使用します。
curl --location --request POST 'https://<admin-host>:<admin-port>/oam/services/rest/ssa/api/v1/oauthpolicyadmin/clientartifacts' \
--header 'Accept: application/json' \
--header 'Authorization: Basic dGVzdDp0ZXN0=' \
--header 'Content-Type: application/json' \
--data '{
"certificateValue": "<CLIENT_CERTIFICATE>",
"clientName": "MTLSClient",
"identityDomainName": "MTLSDomain"
}'
ノート:
発行者がサブジェクトと一致する証明書は自己署名証明書として扱われます。38.13 mTLSクライアント認証の構成
トピック:
この内容は、OAMバンドル・パッチ12.2.1.4.210920以降のリリースにのみ適用されます。
38.13.1 OAMの相互Transport Layer Security (mTLS)について
TLS認証では、サーバーは、証明書(公開キー)を生成することでそのIDを確認します。その後、証明書はTLS検証プロセスによって検証されます。
mTLS (mutual-TLS)では、サーバーとともにクライアントのIDも検証されます。TLSハンドシェイクは、証明書内の公開キーに対応する秘密キーをクライアントが所持しているかどうかの検証と、対応する証明書チェーンの検証に使用されます。
OAMでは、サーバーの証明書チェーンを検証する構成と、ロード・バランサまたはプロキシ終了時のSSLの終了をサポートする構成がサポートされます。SSLが終了するプロキシ・エンド・ポイントのロード・バランサでは、OAMサーバーが検証を実行するため、証明書チェーンを検証する必要はありません。
証明書バインディングについて
証明書バインディングは、OAMでmTLS認証の有無に関係なく有効にできます。これにより、保護されたリソース・アクセス中に相互TLSが所有証明メカニズムとして機能できます。
TLSクライアント証明書バインディングは必須ではありません。バインディングは、アイデンティティ・ドメインおよびクライアントに設定されたissueTLSClientCertificateBoundAccessTokens
構成に基づいて行われます。
証明書バインディングを構成するには、アイデンティティ・ドメインまたはクライアントを作成または変更するときに、issueTLSClientCertificateBoundAccessTokens
をtrue
またはfalse
として設定します。
証明書バインド・アクセス・トークンには、アクセス・トークンがバインドされているクライアント証明書の拇印を含むcnf
(確認)エントリが含まれます。
ノート:
cnf
エントリは、証明書バインド・アクセス・トークンを持つイントロスペクト・エンドポイントのレスポンスにのみ存在し、証明書にバインドされていないアクセス・トークンには存在しません。
38.13.2 mTLSエンドポイントの構成
https://<admin-host>:<admin-port>/oam/services/rest/ssa/api/v1/hostalias/mtls
REST APIを使用してmTLSエンドポイントのhostname
およびport
を設定します。
ノート:
mTLSエンドポイントのhostname
およびport
は、SSLが終了するエンドポイントと一致する必要があります。たとえば、SSLがロードバランサで終了する場合、mTLSエンドポイントのhostname
およびport
は、ロードバランサのhostname
およびport
と一致する必要があります。
curl --location --request POST 'https://<admin-host>:<admin-port>/oam/services/rest/ssa/api/v1/hostalias/mtls' \
--header 'Authorization: Basic dGVzdDp0ZXN0=' \
--header 'Content-Type: application/json' \
--data '{
"hostname": "<HOST_NAME>",
"port": "4443"
}'
mTLS構成を設定した後、検出エンドポイント(.well-known
URL、たとえばhttp://<HOST_NAME>:7777/.well-known/openid-configuration
)を使用して詳細を表示することもできます。
mtls_endpoint_aliases
が含まれます"mtls_endpoint_aliases": {
"token_endpoint": "https://<MTLS_HOST>:<MTLS_PORT>/oauth2/rest/token",
"revocation_endpoint": "https://<MTLS_HOST>:<MTLS_PORT>/oauth2/rest/token/revoke",
"introspection_endpoint": "https://<MTLS_HOST>:<MTLS_PORT>/oauth2/rest/token/introspect"
},
「OpenIDConnectの検出エンドポイントの構成」も参照してください
38.13.3 mTLSの信頼証明書の管理
クライアントは、mTLS認証用の証明書を提供する必要があります。証明書は、既知の認証局(CA)、自己署名、またはカスタムCAから署名できます。証明書が連鎖する場合は、クライアントに証明書チェーンが含まれている必要があります。
信頼できるCA証明書をOAMトラストストアに追加する必要があります。https://<admin-host>:<admin-port>/oam/services/rest/ssa/api/v1/security/trust/oauthClient/certificate
REST APIを使用して、信頼できるCA証明書を管理します。
https://<admin-host>:<admin-port>/oam/services/rest/ssa/api/v1/security/trust/oauthClient/certificate
REST APIのPOSTメソッドを使用して、OAMトラストアに証明書を追加します。たとえば:curl --location --request PUT 'https://<admin-host>:<admin-port>/oam/services/rest/ssa/api/v1/security/trust/oauthClient/certificate' \
--header 'Authorization: Basic dGVzdDp0ZXN0=' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--data-raw '{
"id": "testCACert",
"publicCert": "MIICrTCCAhYCBAuHHScwDQYJKoZIhvcNAQELBQAwgZsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRIwEAYDVQQHEwlDdXBlcnRpbm8xFDASBgNVBAoTC09ibGl4LCBJbmMuMREwDwYDVQQLEwhOZXRQb2ludDE6MDgGA1UEAxMxTmV0UG9pbnQgU2ltcGxlIFNlY3VyaXR5IENBIC0gTm90IGZvciBHZW5lcmFsIFVzZTAeFw0xNzA0MTEwODEwNTZaFw0yNzA0MDkwODEwNTZaMBsxGTAXBgNVBAMMEGRlZmF1bHRfb2FtX2NlcnQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGlNx2IWPZpNsPqCNmR3J/tE750TNhFRtFQ4Xbj72CU2R65Cu+PxwPQQkIP29h2mRjBfZk8hjlH0lcLEz3a6/RQcTXe/EXicEuVz0WMtlusUDO9Em6JYuUMrEy58jPVhEBtJ8iv3S9t7dJc8b3THsADpxARGjSAJHI/zKidn1WssBm+3BA1cIMUMpjUCpl4R5pRJUwHCvSF3G6fE+GXIVZh64ygD5kTuM36GOAyDQ7o6zRIeugNkQ3OJGVLNlhGcwoSvhn8YyBzKzW128J9g+Lj3KNxhM4+MGkrebgI3Ez4ZMw4MhxbpzgrW0KjHq7uKXJFP8EQsCKjZbR/hwxiG6PAgMBAAEwDQYJKoZIhvcNAQELBQADgYEAJYi5tZ9X6gBrvHzZ4wEsXHEuNYnL9MYDUyF6P7nkwMfThns1yyHByoE7WPQd7ans4WBX/HToZfz1xLh50QFqpKDS4C6mD/M9fffSuSHOvR4mVug8cWghORmwc1SSuLLzxXl+LFmnGLwJNtP1ffPCfZqPRrd0lPcO/ifGPz50zfU="
}
詳細は、クライアント信頼証明書RESTエンドポイントのドキュメントを参照してください。
- OCSPサーバー証明書をOAMトラストストアに追加します。たとえば
curl --location --request PUT 'https://<admin-host>:<admin-port>/oam/services/rest/ssa/api/v1/security/trust/oauthClient/certificate' \ --header 'Authorization: Basic dGVzdDp0ZXN0=' \ --header 'Content-Type: application/json' \ --header 'Accept: application/json' \ --data-raw '{ "id": "OCSPServerCert", "publicCert": "MIICrTCCAhYCBAuHHScwDQYJKoZIhvcNAQELBQAwgZsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRIwEAYDVQQHEwlDdXBlcnRpbm8xFDASBgNVBAoTC09ibGl4LCBJbmMuMREwDwYDVQQLEwhOZXRQb2ludDE6MDgGA1UEAxMxTmV0UG9pbnQgU2ltcGxlIFNlY3VyaXR5IENBIC0gTm90IGZvciBHZW5lcmFsIFVzZTAeFw0xNzA0MTEwODEwNTZaFw0yNzA0MDkwODEwNTZaMBsxGTAXBgNVBAMMEGRlZmF1bHRfb2FtX2NlcnQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGlNx2IWPZpNsPqCNmR3J/tE750TNhFRtFQ4Xbj72CU2R65Cu+PxwPQQkIP29h2mRjBfZk8hjlH0lcLEz3a6/RQcTXe/EXicEuVz0WMtlusUDO9Em6JYuUMrEy58jPVhEBtJ8iv3S9t7dJc8b3THsADpxARGjSAJHI/zKidn1WssBm+3BA1cIMUMpjUCpl4R5pRJUwHCvSF3G6fE+GXIVZh64ygD5kTuM36GOAyDQ7o6zRIeugNkQ3OJGVLNlhGcwoSvhn8YyBzKzW128J9g+Lj3KNxhM4+MGkrebgI3Ez4ZMw4MhxbpzgrW0KjHq7uKXJFP8EQsCKjZbR/hwxiG6PAgMBAAEwDQYJKoZIhvcNAQELBQADgYEAJYi5tZ9X6gBrvHzZ4wEsXHEuNYnL9MYDUyF6P7nkwMfThns1yyHByoE7WPQd7ans4WBX/HToZfz1xLh50QFqpKDS4C6mD/M9fffSuSHOvR4mVug8cWghORmwc1SSuLLzxXl+LFmnGLwJNtP1ffPCfZqPRrd0lPcO/ifGPz50zfU=" }
- OCSP証明書検証を有効にします。詳細は、「OCSP証明書検証の有効化」を参照してください
38.13.4 mTLSをサポートする追加オプションの構成
mTLS認証をサポートするための追加構成を実行します
- 「WebLogicプラグインの有効化」を「はい」に設定します。
- WebLogicコンソールにログインし、サーバー・インスタンスに移動します(たとえば、oam_server1やAdvanced)
- 「クライアント証明書プロキシの有効化」チェック・ボックスを選択します
- 「WebLogicプラグインの有効化」オプションを「はい」に設定します
- SSLがOHSで終了した場合、
MIDDLEWARE_HOME/user_projects/domains/base_domain/config/fmwconfig/components/OHS/instances/ohs1
の下にあるohs ssl.confファイルで次の変更を実行します:- SSLウォレットで、
"${ORACLE_INSTANCE}"
を検索し、次の行でSSLOptions
、StdEnvVars
およびExportCertData
を追加します。 SSLVerifyClient none
をSSLVerifyClient require
に変更します
- SSLウォレットで、
- mTLS構成をサポートするようにロード・バランサを構成します。ロード・バランサで双方向SSLエンドポイントを構成し、クライアント証明書のCAおよび中間CAをトラスト・ストアのロード・バランサにインポートします。詳細は、「Web層でのSSLの構成」を参照してください
- カスタム証明書ヘッダーのサポートを提供するには、アイデンティティ・ドメインREST APIの
CustomAttrs
の下にパラメータ"enableHeaderCertValue":true
を追加します。たとえば:"customAttrs":"{"domainCertValidityInDays":"30", "consentExpiryTimeInMinutes":"10","enableHeaderCertValue":true}"
有効にしたら、次の2つの
http
ヘッダーの下にヘッダーを指定する必要があります:SSL_CLIENT_CERT
:クライアント証明書。SSL_CLIENT_ROOT_CERT
:ルートCAまたは中間CA証明書
ノート:
これは、SSL接続を終了するOHS以外のロード・バランサにのみ適用できます
38.13.5 2-Legged mTLS認証フローの例
次の例は、2-legged mTLS認証フローの例を示しています:
- アイデンティティ・ドメインを作成します
curl --location --request POST 'https://<admin-host>:<admin-port>/oam/services/rest/ssa/api/v1/oauthpolicyadmin/oauthidentitydomain' \ --header 'Authorization: Basic dGVzdDp0ZXN0=' \ --header 'Content-Type: application/json' \ --data '{ "name": "MTLSDomain", "identityProvider": "UserIdentityStore1", "description": "MTLSDomain", "tokenSettings": [ { "tokenType": "ACCESS_TOKEN", "tokenExpiry": 3600, "lifeCycleEnabled": false, "refreshTokenEnabled": false, "refreshTokenExpiry": 86400, "refreshTokenLifeCycleEnabled": false }, { "tokenType": "AUTHZ_CODE", "tokenExpiry": 3600, "lifeCycleEnabled": false, "refreshTokenEnabled": false, "refreshTokenExpiry": 86400, "refreshTokenLifeCycleEnabled": false }, { "tokenType": "SSO_LINK_TOKEN", "tokenExpiry": 3600, "lifeCycleEnabled": false, "refreshTokenEnabled": false, "refreshTokenExpiry": 86400, "refreshTokenLifeCycleEnabled": false } ], "errorPageURL": "/oam/pages/error.jsp", "consentPageURL": "/oam/pages/consent.jsp", "customAttrs": "{\"domainCertValidityInDays\":\"30\", \"consentExpiryTimeInMinutes\":\"10\"}", "tokenEndpointAuthMethodsSupported": [ "tls_client_auth", "self_signed_tls_client_auth" ], "issueTLSClientCertificateBoundAccessTokens":"true", "tlsClientAuthSubjectDN":"CN=%CLIENT_ID_PLACEHOLDER%, OU=OAM, O=Oracle, L=BLR, ST=KA, C=IN" }'
- リソースを作成します
curl --location --request POST 'https: //<admin-host>:<admin-port>/oam/services/rest/ssa/api/v1/oauthpolicyadmin/application' \ --header 'Content-Type: application/json' \ --header 'Authorization: Basic dGVzdDp0ZXN0=' \ --data '{ "name": "MTLSResource", "description": "Oracle Cloud", "scopes": [ { "scopeName": "viewRes", "description": "View registered resources" }, { "scopeName": "editRes", "description": "Edit registered resources" }, { "scopeName": "delRes", "description": "Delete registered resources" } ], "tokenAttributes": [ { "attrName": "sessionId", "attrValue": "$session.id", "attrType": "DYNAMIC" }, { "attrName": "resSrvAttr", "attrValue": "RESOURCECONST", "attrType": "STATIC" } ], "idDomain": "MTLSDomain", "audienceClaim": { "subjects": [ "user" ] } }'
- クライアントを作成します:
curl --location --request POST 'https://<admin-host>:<admin-port>/oam/services/rest/ssa/api/v1/oauthpolicyadmin/client' \ --header 'Content-Type: application/json' \ --header 'Authorization: Basic dGVzdDp0ZXN0=' \ --data '{ "attributes": [ { "attrName": "staticAttr", "attrValue": "CustomValue", "attrType": "static" } ], "secret": "welcome1", "id": "MTLSClient", "scopes": [ "MTLSResource.viewRes", "MTLSResource.editRes", "MTLSResource.delRes" ], "clientType": "CONFIDENTIAL_CLIENT", "idDomain": "MTLSDomain", "description": "OAuth Client Description", "name": "MTLSClient", "grantTypes": [ "PASSWORD", "CLIENT_CREDENTIALS", "JWT_BEARER", "REFRESH_TOKEN", "AUTHORIZATION_CODE", "IMPLICIT" ], "defaultScope": "MTLSResource.viewRes", "redirectURIs": [ { "url": "{redirect_URL}", "isHttps": false } ], "tokenEndpointAuthMethod":"tls_client_auth", "issueTLSClientCertificateBoundAccessTokens":"true", "tlsClientAuthSubjectDN":"C=IN, ST=KA, L=BLR, O=Oracle, OU=OAM, CN=client2, EMAILADDRESS=client2@oracle.com" }'
- CA証明書をOAMトラストストアに追加します:
curl --location --request POST 'https://<admin-host>:<admin-port>/oam/services/rest/ssa/api/v1/security/trust/oauthClient/certificate?certID=MTLSClient' \ --header 'Accept: application/json' \ --header 'Authorization: Basic dGVzdDp0ZXN0=' \ --header 'Content-Type: application/json' \ --data '{ "publicCert": "<CA_CERT>", "id": "MTLSClient" }'
- mTLSエンドポイントを使用した2-leggedフローはここから始まります:
curl -k --key <PATH_TO_CLIENT_KEY> --cert <PATH_TO_CLIENT_CERTIFICATE> --location --request POST 'https://<mTLS_HOST>:<mTLS_PORT>/oauth2/rest/token' \ --header 'X-OAUTH-IDENTITY-DOMAIN-NAME: MTLSDomain' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'grant_type=PASSWORD' \ --data-urlencode 'redirect_uri=<REDIRECT_URI>' \ --data-urlencode 'username=weblogic' \ --data-urlencode 'password=<PASSWORD>' \ --data-urlencode 'client_id=MTLSClient'
- イントロスペクトREST APIを実行して、トークンから詳細を取得します。
curl --key <PATH_TO_CLIENT_KEY> --cert <PATH_TO_CLIENT_CERTIFICATE> --location --request POST 'https://<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token/introspect' \ --header 'X-OAUTH-IDENTITY-DOMAIN-NAME: MTLSDomain' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'token=<ACCESS_TOKEN>
受信したレスポンスの例を次に示します:{ "iss": "http://<HOST_NAME>:7777", "aud": [ "MTLSResource", "http://<HOST_NAME>:7777" ], "exp": 1629898603, "jti": "gv4Ms01THuOWAE27d3lMLQ", "iat": 1629895003, "sub": "weblogic", "client": "MTLSClient", "scope": [ "MTLSResource.viewRes" ], "domain": "MTLSDomain", "staticAttr": "CustomValue", "cnf": { "x5t#S256": "yxa_pacafklt_5mqjjc_shtb9qhbvdx0pzght3a5nxc" }, "rem_exp": 3409, "active": true }
38.13.6 3-Legged mTLS認証フローの例
次の例は、3-legged mTLS認証フローの例を示しています:
- アイデンティティ・ドメインを作成します
curl --location --request POST 'https://<admin-host>:<admin-port>/oam/services/rest/ssa/api/v1/oauthpolicyadmin/oauthidentitydomain' \ --header 'Authorization: Basic dGVzdDp0ZXN0=' \ --header 'Content-Type: application/json' \ --data '{ "name": "MTLSDomain", "identityProvider": "UserIdentityStore1", "description": "MTLSDomain", "tokenSettings": [ { "tokenType": "ACCESS_TOKEN", "tokenExpiry": 3600, "lifeCycleEnabled": false, "refreshTokenEnabled": false, "refreshTokenExpiry": 86400, "refreshTokenLifeCycleEnabled": false }, { "tokenType": "AUTHZ_CODE", "tokenExpiry": 3600, "lifeCycleEnabled": false, "refreshTokenEnabled": false, "refreshTokenExpiry": 86400, "refreshTokenLifeCycleEnabled": false }, { "tokenType": "SSO_LINK_TOKEN", "tokenExpiry": 3600, "lifeCycleEnabled": false, "refreshTokenEnabled": false, "refreshTokenExpiry": 86400, "refreshTokenLifeCycleEnabled": false } ], "errorPageURL": "/oam/pages/error.jsp", "consentPageURL": "/oam/pages/consent.jsp", "customAttrs": "{\"domainCertValidityInDays\":\"30\", \"consentExpiryTimeInMinutes\":\"10\"}", "tokenEndpointAuthMethodsSupported": [ "tls_client_auth", "self_signed_tls_client_auth" ], "issueTLSClientCertificateBoundAccessTokens":"true", "tlsClientAuthSubjectDN":"CN=%CLIENT_ID_PLACEHOLDER%, OU=OAM, O=Oracle, L=BLR, ST=KA, C=IN" }'
- リソースを作成します
curl --location --request POST 'https: //<admin-host>:<admin-port>/oam/services/rest/ssa/api/v1/oauthpolicyadmin/application' \ --header 'Content-Type: application/json' \ --header 'Authorization: Basic dGVzdDp0ZXN0=' \ --data '{ "name": "MTLSResource", "description": "Oracle Cloud", "scopes": [ { "scopeName": "viewRes", "description": "View registered resources" }, { "scopeName": "editRes", "description": "Edit registered resources" }, { "scopeName": "delRes", "description": "Delete registered resources" } ], "tokenAttributes": [ { "attrName": "sessionId", "attrValue": "$session.id", "attrType": "DYNAMIC" }, { "attrName": "resSrvAttr", "attrValue": "RESOURCECONST", "attrType": "STATIC" } ], "idDomain": "MTLSDomain", "audienceClaim": { "subjects": [ "user" ] } }'
- クライアントを作成します
curl --location --request POST 'https://<admin-host>:<admin-port>/oam/services/rest/ssa/api/v1/oauthpolicyadmin/client' \ --header 'Content-Type: application/json' \ --header 'Authorization: Basic dGVzdDp0ZXN0=' \ --data '{ "attributes": [ { "attrName": "staticAttr", "attrValue": "CustomValue", "attrType": "static" } ], "secret": "welcome1", "id": "MTLSClient", "scopes": [ "MTLSResource.viewRes", "MTLSResource.editRes", "MTLSResource.delRes" ], "clientType": "CONFIDENTIAL_CLIENT", "idDomain": "MTLSDomain", "description": "OAuth Client Description", "name": "MTLSClient", "grantTypes": [ "PASSWORD", "CLIENT_CREDENTIALS", "JWT_BEARER", "REFRESH_TOKEN", "AUTHORIZATION_CODE", "IMPLICIT" ], "defaultScope": "MTLSResource.viewRes", "redirectURIs": [ { "url": "{redirect_URL}", "isHttps": false } ], "tokenEndpointAuthMethod":"tls_client_auth", "issueTLSClientCertificateBoundAccessTokens":"true", "tlsClientAuthSubjectDN":"C=IN, ST=KA, L=BLR, O=Oracle, OU=OAM, CN=client2, EMAILADDRESS=client2@oracle.com" }'
- CA証明書をOAMトラストストアに追加します
curl --location --request POST 'https://<admin-host>:<admin-port>/oam/services/rest/ssa/api/v1/security/trust/oauthClient/certificate?certID=MTLSClient' \ --header 'Accept: application/json' \ --header 'Authorization: Basic dGVzdDp0ZXN0=' \ --header 'Content-Type: application/json' \ --data '{ "publicCert": "<CA_CERT>", "id": "MTLSClient" }'
- 3-leggedフローはここから始まります:
ブラウザを開き、ブラウザから次を実行します:
https://<OHS_Host>:<OHS_Port>/oauth2/rest/authorize?response_type=code&domain=MTLSDomain&client_id=MTLSClient&scope=MTLSResource.viewRes%20openid&state=code1234&redirect_uri=<redirect_URL>&nonce=""
ユーザー名とパスワード資格証明を使用してログインします。次の承認ページで、
「許可」
をクリックしてページURLから認証コードを取得します。 - 前のステップの認証コードを使用してアクセス・トークンをフェッチします
curl --key <PATH_TO_CLIENT_KEY> --cert <PATH_TO_CLIENT_CERTIFICATE> --location --request POST 'https://<mTLS_HOST>:<mTLS_PORT>/oauth2/rest/token' \ --header 'X-OAUTH-IDENTITY-DOMAIN-NAME: MTLSDomain' \ --header 'Authorization: Basic dGVzdDp0ZXN0=' \ --data-urlencode 'grant_type=AUTHORIZATION_CODE' \ --data-urlencode 'code=<CODE>' \ --data-urlencode 'redirect_uri=<redirect_URL>' \ --data-urlencode 'client_id=MTLSClient'
- イントロスペクトREST APIを実行して、トークンから詳細を取得します。
curl --key <PATH_TO_CLIENT_KEY> --cert <PATH_TO_CLIENT_CERTIFICATE> --location --request POST 'https://<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token/introspect' \ --header 'X-OAUTH-IDENTITY-DOMAIN-NAME: MTLSDomain' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'token=<ACCESS_TOKEN>'
受信したレスポンスの例を次に示します:{ "iss": "http://<HOST_NAME>:7777", "aud": [ "MTLSResource", "MTLSClient", "http://<HOST_NAME>:7777", ], "exp": 1629894002, "jti": "cuWu5Mzae9Hn00cBUErzKw", "iat": 1629890402, "sub": "weblogic", "client": "MTLSClient", "scope": [ "MTLSResource.viewRes", "openid" ], "domain": "MTLSDomain", "grant": "AUTHORIZATION_CODE", "sessionId": "5e63e6ba-7eca-43fa-b264-52f4e26aecbd=", "staticAttr": "CustomValue", "nonce": "%22%22", "resSrvAttr": "RESOURCECONST", "cnf": { "x5t#S256": "yxa_pacafklt_5mqjjc_shtb9qhbvdx0pzght3a5nxc" }, "rem_exp": 3523, "active": true }
38.14 OAMでのProof Key for Code Exchange (PKCE)のサポート
この項では、Proof Key for Code Exchange (PKCE)拡張機能について詳細に説明します。
OAuth 2.0、3-leggedフローでは、authorization_code
、client_id
およびclient_secret
パラメータを使用して認可サーバーからアクセス・トークンをリクエストするパブリック・クライアントは、インターセプト攻撃に対して脆弱です。攻撃者が認可コードおよびclient_secret
にアクセスできるようになると、アクセス・トークンも取得できるため、3-leggedフローのセキュリティ全体が損なわれます。
これを防ぐために、OAMでは、OAuth 2.0認可コード付与フローに対してProof Key for Code Exchange (PKCE)サポートが提供されています。
一般的なPKCEフローでは、クライアントは静的なclient_secret
ではなく、code_verifier
という一時的なワンタイム動的資格証明を使用します。code_verifier
からSHA256でハッシュした文字列(code_challenge
)が生成され、それが認可コードのリクエストに使用されます。リクエスト内でcode_verifier
とともに認可コードを送信することにより、アクセス・トークンが認可サーバーからリクエストされます。認可サーバー(OAM)は、code_verifier
をハッシュして、先に受信したcode_challenge
と比較します。この2つの値が一致した場合にのみアクセス・トークンを発行することで、認可コード付与フローのセキュリティを強化します。
ノート:
OAMは、パディング付きのBase64でcode_challenge
を検証します。これを修正し、code_challenge
に関してRFC準拠の動作(https://tools.ietf.org/html/rfc7636#appendix-Aで説明されているパディングなしのBase64)を行うようにするには、OAMパッチ32406872をダウンロードして適用する必要があります。詳細は、Oracle Access Manager (OAM) 12.2.1.4でOAuth Proof Key For Code Exchange (PKCE)を有効化する方法(ドキュメントID 2755209.1)
のノート(https://support.oracle.com)を参照してください。
OAMの今後のすべてのリリースでは、RFC準拠の動作のみがサポートされます。
PKCEの有効化およびPKCEフローを介したアクセス・トークンの生成の詳細は、次の各項を参照してください。
38.14.1 PKCEの有効化
3-legged OAuth 2.0コード付与フローを使用してセキュリティを強化する必要がある場合は、ドメイン・レベルまたはクライアント・レベルでUsePKCE
を設定することで、PKCEを有効にできます。
UsePKCE
の値の大文字と小文字は区別されます。- ドメイン・レベルの値は、その特定のドメインにあるすべてのクライアントに適用可能です。特定のクライアントにPKCEを適用する必要がある場合は、そのクライアントに対してのみ
UsePKCE
パラメータを設定することでPKCEを有効にできます。 - クライアント・レベルの値は、ドメイン・レベルの値より優先されます。
ドメイン・レベルでのPKCEの有効化
customAttrs
にUsePKCE
を追加し、それを次のいずれかの値に設定します:
値 | 動作と説明 |
---|---|
ALL_CLIENTS_TYPES |
すべてのクライアント・タイプに対してPKCEが有効になります。
|
ALL_CLIENTS_TYPES_STRICT |
すべてのクライアント・タイプに対してPKCEが有効になります。 |
PUBLIC_CLIENTS |
パブリックでないクライアントに対してPKCEパラメータを使用した場合は、無視されます。 |
PUBLIC_CLIENTS_STRICT |
|
次の例は、ドメインの作成時にPKCEを有効にするサンプル・リクエストを示しています。PKCEパラメータで既存のドメインを更新するには、PUT
メソッドを使用します。
REST APIのドキュメントについては、「アイデンティティ・ドメインRESTエンドポイント」を参照してください。
curl --request POST '<AdminServer>:<AdminPort>/oam/services/rest/ssa/api/v1/oauthpolicyadmin/oauthidentitydomain' \
--header 'Authorization: Basic d2VibG9naWM6d2VibG9naWMx' \
--header 'Content-Type: application/json' \
--header 'Cookie: JSESSIONID=OweshB5ejqWvx6wDrFbHD1sc67WsGbEWu4sBp3aeZ3Ki7kLPLEY7!1934427792' \
--data-raw '{
"name": "DemoDomain",
"identityProvider": "UserIdentityStore1",
"description": "Test Domain",
"tokenSettings": [
{
"tokenType": "ACCESS_TOKEN",
"tokenExpiry": 3600,
"lifeCycleEnabled": false,
"refreshTokenEnabled": false,
"refreshTokenExpiry": 86400,
"refreshTokenLifeCycleEnabled": false
},
{
"tokenType": "AUTHZ_CODE",
"tokenExpiry": 3600,
"lifeCycleEnabled": false,
"refreshTokenEnabled": false,
"refreshTokenExpiry": 86400,
"refreshTokenLifeCycleEnabled": false
},
{
"tokenType": "SSO_LINK_TOKEN",
"tokenExpiry": 3600,
"lifeCycleEnabled": false,
"refreshTokenEnabled": false,
"refreshTokenExpiry": 86400,
"refreshTokenLifeCycleEnabled": false
}
],
"errorPageURL": "/oam/pages/servererror.jsp",
"consentPageURL": "/oam/pages/consent.jsp",
"customAttrs": "{\"usePKCE\":\"ALL_CLIENTS_TYPES\"}"
}'
クライアント・レベルでのPKCEの有効化
UsePKCE
パラメータを次のいずれかの値に設定します:
値 | 動作と説明 |
---|---|
STRICT |
|
NON_STRICT |
|
次の例は、クライアントの作成時にPKCEを有効にするサンプル・リクエストを示しています。PKCEパラメータで既存のクライアントを更新するには、PUT
メソッドを使用します。
EST APIのドキュメントについては、「クライアントRESTエンドポイント」を参照してください。
curl --request POST '<AdminServer>:<AdminPort>/oam/services/rest/ssa/api/v1/oauthpolicyadmin/client' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic d2VibG9naWM6d2VibG9naWMx' \
--header 'Cookie: JSESSIONID=OweshB5ejqWvx6wDrFbHD1sc67WsGbEWu4sBp3aeZ3Ki7kLPLEY7!1934427792' \
--data-raw '{
"attributes": [
{
"attrName": "customeAttr1",
"attrValue": "CustomValue",
"attrType": "static"
}
],
"secret": "<client_secret>",
"id": "DemoClientId",
"scopes": [
"DemoResServer.scope1"
],
"clientType": "PUBLIC_CLIENT",
"idDomain": "DemoDomain",
"description": "Client Description",
"name": "DemoClient",
"grantTypes": [
"PASSWORD",
"CLIENT_CREDENTIALS",
"JWT_BEARER",
"REFRESH_TOKEN",
"AUTHORIZATION_CODE"
],
"defaultScope": "DemoResServer.scope1",
"usePKCE": "NON_STRICT",
"redirectURIs": [
{
"url": "http://localhost:8080/Sample.jsp",
"isHttps": true
}
]
}'
38.14.2 アクセス・トークン生成のためのPKCEフロー
この項では、アクセス・トークン生成のためのPKCEフローについて詳細に説明します。
customAttrs
にUsePKCE
を追加して、アイデンティティ・ドメインを作成または更新します。詳細は、「ドメイン・レベルでのPKCEの有効化」を参照してください- リソース・サーバーがすでに存在する場合は、このステップをスキップします。そうでない場合は、「リソースの作成」の説明に従ってリソース・サーバーを追加します。
UsePKCE
パラメータを追加して、OAuthクライアントを作成または更新します。詳細は、「クライアント・レベルでのPKCEの有効化」を参照してください- OAuth 3-leggedフローがすでに設定されている場合は、このステップをスキップします。そうでない場合は、「OAuth 12cのランタイムREST API」の「3-leggedフロー — プロセス」の項の説明に従って、OAMサーバーおよびWebゲートで手動のサイド・ステップを実行します
-
code_verifier
という暗号論的にランダムなキーを生成します。code_verifier
とは、文字A-Z、a-z、0-9および句読点文字- (ハイフン)、. (ピリオド)、_ (アンダースコア)、および~ (チルダ)を使用して生成された、暗号論的にランダムなURLセーフの文字列のことです。文字列は43文字から128文字にする必要があります。ノート:
認可リクエストごとに一意のcode_verifier
を作成する必要があります。たとえば、
Y1lgBSx8gRsruplrdpGiG-9Lkv~kna1q2pgwXY7UYKc~~jTgMkmUlZkZkapJGT6X.m12.ZUBDj24qWuPGHl21x3vyFEC.m_XDH_JTw4Qk6_a62Qw~e0sVp3I-AHYhTzn
などですこの
code_verifier
は、後でアクセス・トークンをリクエストするために使用されます。 -
code_verifier
からcode_challenge
文字列を生成します。code_challenge
は、code_verifier
のSHA256ハッシュの変換済BASE64-URLエンコード文字列です。たとえば、code_verifierが
Y1lgBSx8gRsruplrdpGiG-9Lkv~kna1q2pgwXY7UYKc~~jTgMkmUlZkZkapJGT6X.m12.ZUBDj24qWuPGHl21x3vyFEC.m_XDH_JTw4Qk6_a62Qw~e0sVp3I-AHYhTzn
の場合、変換済のSHA256ハッシュ文字列のcode_challengeは、Ec-YfJRRibqf_myiWqObZfT-M1HthBUTygBH73zEHbc
になります。 - ブラウザを使用して、認可コードをリクエストします。
authorization_code
リクエストでcode_challenge_method
とともにcode_challenge
を認可サーバー(OAM)に送信します。code_challenge_method
の値は次のいずれかです:Plain
:code_verifier
をハッシュ値ではなくcode_challenge
として設定します。S256
(推奨):code_verifier
のハッシュ値をcode_challenge
として設定することを示します。
ノート:
一意の認可コードは、1つのアクセス・トークンに対してのみ交換できます。認可コードの再使用は、OAMサーバーによって拒否されます。認可コードのサンプル・リクエスト
http://<OHS Hostname>:<OHS Port>/oauth2/rest/authz?response_type=code &client_id=TestClient&domain=TestDomain&scope=TestResourceServer.scope1&state=xyz &redirect_uri=http://localhost:8080/Sample.jsp &code_challenge=Ec-YfJRRibqf_myiWqObZfT-M1HthBUTygBH73zEHbc &code_challenge_method=S256
認可コードのサンプル・レスポンス
http://localhost:8080/Sample.jsp?code=UlF6aVY3eFVIemNTVWhVcWlmM0o1UT09fkJ5b0J4MlRVdFhwVFYySXhKR1RUS1NnOWV4UE1oUGRKMFYxR3RmbGt FYjJYK3lMUUxDRGxyZXNHa2VrRXRtQVp1S25MYVY1YXVkbFFGNmx5MUtCcXFZYWJhRlhpRENIcjI0Vm1YZjNtRE1hTzFDL1lmbEhKK0wvK2pBeUdTZWNYbEMza2dBSnM0Q0ZrZ1R NNmQ3SUVuSmZJNExScEI4ZUJySVpMT1hEZ1p5alp5eHVxSkd2RllCdVFqcFpEQTJEaCt5Z1JxN21ZWFQyc3JKQi9EY0JrTDhiUVBlb0laNkFzdVhJL1JURjBpWFVvK2VPelVxaVo zSjBMMjJncmZlcEhxMzh1N0hkZ0pqaEZZZmgyRWJHakkxMnlBeE9nVlRxRXdxcXhaazdCdW5mQ3VORFkvVHBLUXRvNEJpUzlEby9vcXlXaEJnZ08vMjExbE5NSFhHUVJFTHkrTlp 4aGNWUzBVMFd2cFVJcWpUd3ZHVjBEZmlaOVBQbWI5b3FhT3gvUFpXdVdrYjczRDJBeUw4RVJjdjMyQ2NnTEZRMXV0aDE2enVOYm9aYVNVb1pjOTJsRGliTGJxRWYrOTZtbXlVNll SNkxRWEVqd2ovTVBpaHc2TzRrbFZXMysrM2kyaGxuYmhoNFdOeENSL1NvLysrTDBXQktUQVhrb2Y0NzF6WTY1VXhIcFg0bG56REoxcURjTFFlSnNMUUE1aVNtMWtocDlzYW1CRFd 0YWRpcEhsT1JzK0hydDk4K0pFb0ZaSDYwaWJ1QlZMZGc0dzJ2ekh2ZWpLWU1ldnBIUWdjRVlBeDVVaENmOVg4dloyb0hhV0J6ekMyMExCQTdTdnFudyt1ZVV6Nkp3cWZON1N6VGJ0 UnA3UGk2U1JablVBK0k1bTduR1haOWwzVklQeHRKWWIwNHVObXY5NkFxN2tUMEMwb0djb2FlK1c0NGFTekFvKzd1bFdFbnFuZz09&state=xyz
authorization_code
およびcode_verifier
を使用して、認可サーバー(OAM)にアクセス・トークンをリクエストします。アクセス・トークンのサンプル・リクエスト
curl --request POST 'http://<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token' \ --header 'X-OAUTH-IDENTITY-DOMAIN-NAME: DemoDomain' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --header 'Cookie: JSESSIONID=OweshB5ejqWvx6wDrFbHD1sc67WsGbEWu4sBp3aeZ3Ki7kLPLEY7!1934427792' \ --data-urlencode 'grant_type=AUTHORIZATION_CODE' \ --data-urlencode 'code=UlF6aVY3eFVIemNTVWhVcWlmM0o1UT09fkJ5b0J4MlRVdFhwVFYySXhKR1RUS1NnOWV4UE1oUGRKMFYxR3RmbGt FYjJYK3lMUUxDRGxyZXNHa2VrRXRtQVp1S25MYVY1YXVkbFFGNmx5MUtCcXFZYWJhRlhpRENIcjI0Vm1YZjNtRE1hTzFDL1lmbEhKK0wvK2pBe UdTZWNYbEMza2dBSnM0Q0ZrZ1RNNmQ3SUVuSmZJNExScEI4ZUJySVpMT1hEZ1p5alp5eHVxSkd2RllCdVFqcFpEQTJEaCt5Z1JxN21ZWFQyc3J KQi9EY0JrTDhiUVBlb0laNkFzdVhJL1JURjBpWFVvK2VPelVxaVozSjBMMjJncmZlcEhxMzh1N0hkZ0pqaEZZZmgyRWJHakkxMnlBeE9nVlRxR XdxcXhaazdCdW5mQ3VORFkvVHBLUXRvNEJpUzlEby9vcXlXaEJnZ08vMjExbE5NSFhHUVJFTHkrTlp4aGNWUzBVMFd2cFVJcWpUd3ZHVjBEZml aOVBQbWI5b3FhT3gvUFpXdVdrYjczRDJBeUw4RVJjdjMyQ2NnTEZRMXV0aDE2enVOYm9aYVNVb1pjOTJsRGliTGJxRWYrOTZtbXlVNllSNkxRW EVqd2ovTVBpaHc2TzRrbFZXMysrM2kyaGxuYmhoNFdOeENSL1NvLysrTDBXQktUQVhrb2Y0NzF6WTY1VXhIcFg0bG56REoxcURjTFFlSnNMUUE1 aVNtMWtocDlzYW1CRFd0YWRpcEhsT1JzK0hydDk4K0pFb0ZaSDYwaWJ1QlZMZGc0dzJ2ekh2ZWpLWU1ldnBIUWdjRVlBeDVVaENmOVg4dloyb0h hV0J6ekMyMExCQTdTdnFudyt1ZVV6Nkp3cWZON1N6VGJ0UnA3UGk2U1JablVBK0k1bTduR1haOWwzVklQeHRKWWIwNHVObXY5NkFxN2tUMEMwb0 djb2FlK1c0NGFTekFvKzd1bFdFbnFuZz09' \ --data-urlencode 'redirect_uri=http://localhost:8080/Sample.jsp' \ --data-urlencode 'code_verifier=Y1lgBSx8gRsruplrdpGiG-9Lkv~kna1q2pgwXY7UYKc~~jTgMkmUlZkZkapJGT6X.m12.ZUBDj24qWuPGHl21x3vyFEC.m_XDH_JTw4Qk6_a62Qw~e0sVp3I-AHYhTzn' \ --data-urlencode 'client_id=DemoClientId'
アクセス・トークンのサンプル・レスポンス
{"access_token":"eyJraWQiOiJEZW1vRG9tYWluIiwieDV0IjoieGVmZExvZnpienRnTkJ2NGR3QXFnYkJyZGhvIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJodHRwOi8vc2xjMTZmc3UudXMub3JhY2 xlLmNvbToxNzI5OC9vYXV0aDIiLCJhdWQiOlsiRGVtb1Jlc1NlcnZlciIsImFiMCJdLCJleHAiOjE2MDQ5OTM0ODcsImp0aSI6InFPV0ZKYk1tdldmTW5IalA4Z0hVamciLCJpYXQiOjE2MDQ5ODk4ODcsInN1YiI6In dlYmxvZ2ljIiwiY3VzdG9tZUF0dHIxIjoiQ3VzdG9tVmFsdWUiLCJjb2RlX2NoYWxsZW5nZV9tZXRob2QiOiJTMjU2Iiwic2Vzc2lvbklkIjoiOTEyNTA2NWItZDJiNC00YWE1LTliNTctZjllZTU3NDUzZjQyfDJraS 9iWnRHYkYyT3FXOWhDRkJHcFpkcjJDTjZaTnJJWGszMFNURUV1N1k9IiwiY29kZV9jaGFsbGVuZ2UiOiJFYy1ZZkpSUmlicWZfbXlpV3FPYlpmVC1NMUh0aEJVVHlnQkg3M3pFSGJjPSIsInJlc1NydkF0dHIiOiJSRV NPVVJDRUNPTlNUIiwiY2xpZW50IjoiRGVtb0NsaWVudElkIiwic2NvcGUiOlsiRGVtb1Jlc1NlcnZlci5zY29wZTEiXSwiZG9tYWluIjoiRGVtb0RvbWFpbiJ9.cpR4L9UhIF4ZyPyelKgUeHzVQlIiqIN0vaqqPmC8a ed19JQFRzpI4xL8jlU4cFXFd9bwSX3_Y6s5Y16eMtSQ1DnOX-u-eoFYE4O6G8AitOAG2oWy82R1O5YJ693Aa7ovVf2VZ8Y1y-JG17HBK4TBXqUgOLhVgURtLsPCJ_Knjyut_TC44NbxsVfRAuOo2li-3vSeCrAi776bM 6TXLPo9VeYJvhGmVQyFA6Fe4QZ5qSLrU2r8Oi7p0plCjTQgEIt2EoHjH88-nfbZ35F4K3zha3UOh4l1gAtkq0HgkP2okwIcMNPk7t0p6kXMWNNm9tDAWCCOKN_Fhyv2_c7JqRZSrQ", "token_type":"Bearer","expires_in":3600}
ノート:
OAMはcode_verifier
をハッシュして、先に受信したcode_challenge
と比較します。この2つの値が一致した場合にのみ、アクセス・トークンが発行されます。- アクセス・トークンを検証します。
アクセス・トークンのサンプル・リクエストの検証
curl --location --request GET 'http://<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token/info?access_token=<AccessToken> \ --header 'X-OAUTH-IDENTITY-DOMAIN-NAME: DemoDomain' \ --header 'Cookie: JSESSIONID=d4SxI2e58dgP6XbZepQo8uPRequ1cynWMjKtQyymVQhbi424TIOl!1934427792'
38.15 OAMでのトークン交換サポート
この項では、OAMでのトークン交換サポートについて詳しく説明します。
トークン交換は、偽装または委任のユースケースでトークンを交換するメカニズムをOAuthクライアントに提供します。詳細は、RFC 8693を参照してください。
38.15.1 トークン交換サポートの有効化
トークン交換サポートを有効にするには、複数のアイデンティティ・ドメイン・カスタム属性、リソース・サーバー・トークン属性およびクライアントgrant_type TOKEN_EXCHANGEを使用する必要があります。
名前 | 説明 | デフォルト |
---|---|---|
TokenExchange_DelegationEnabled、TokenExchange_ImpersonationEnabled |
委任/偽装を有効にする場合はtrueに設定します |
false |
TokenExchange_TokenExpiryInSeconds |
issued_tokenの有効期限 |
有効期限はACCESS_TOKENのtokenExpiry値(既存の設定)に設定されます |
TokenExchange_DelegationClaimsToBeCopied、TokenExchange_ImpersonationClaimsToBeCopied |
','で区切られた値は、subject_tokenからissued_tokenにコピーされるクレームのリストを示します。例: mygroups,name |
null (sub以外のクレームはsubject_tokenからコピーされません) |
TokenExchange_EnforceMayActClaim |
subject_tokenにmay_actクレームが存在する場合、may_actクレームのsubクレームはactor_tokenのsubクレームと一致します。 チェックを無効にする場合はfalseに設定します |
true |
TokenExchange_OAMIssuers |
','で区切られたリストは、OAM発行者とみなされる発行者のリストを示します。承諾はOAMトークンに対してのみ評価されます。デフォルトでは、発行者フィールドが構成済のOAMサーバーLBRと一致している場合、トークンはOAMインスタンスによって発行されるとみなされます。発行者が異なっている場合は、このプロパティを使用できます。このプロパティがALL_ISSUERSに設定されている場合、すべてのトークンが同じOAMインスタンスによって発行されるとみなされます。これは、','区切りのプロパティです。承諾管理が有効になっているMDC環境で必要になる場合があります。 |
なし |
名前 | 説明 | デフォルト |
---|---|---|
TokenExchange_AllowedClientsForDelegation、TokenExchange_AllowedClientsForImpersonation |
','で区切られた値は、リソース・サーバー・スコープとともにissued_tokenを作成することを許可されるクライアントIDのリストを示します。 |
null (許可されるクライアントはありません) |
ノート:
発行されたトークンで想定されるスコープをクライアントに割り当てる必要があります。名前 | 値 | デフォルト |
---|---|---|
grant_type | TOKEN_EXCHANGE | Null |
表38-8 リクエストのパラメータ
名前 | 必須/省略可能 | サポート・タイプ/値 |
---|---|---|
grant_type | 必須 | TOKEN_EXCHANGEまたは urn:ietf:params:oauth:grant-type:token-exchange |
resource | scopeパラメータが指定されている場合は省略可能。それ以外の場合は必須。 | OAMで構成されているResourceServerName。https://datatracker.ietf.org/doc/html/draft-ietf-oauth-resource-indicators-08で定義されている複数のパラメータを指定できます |
audience | OPTIONAL | 任意の文字列。https://datatracker.ietf.org/doc/html/draft-ietf-oauth-resource-indicators-08で定義されている複数のパラメータを指定できます |
scope | リソース・パラメータが指定されている場合は省略可能。それ以外の場合は必須。 | スペースで区切られたscope値。 |
requested_token_type | OPTIONAL | urn:ietf:params:oauth:token-type:jwt |
subject_token | 必須 | JWSトークン |
subject_token_type | 必須 | urn:ietf:params:oauth:token-type:jwt |
actor_token | OPTIONAL | JWSトークン |
actor_token_type | 省略可能。actor_tokenが渡された場合のみ必須 | urn:ietf:params:oauth:token-type:jwt |
表38-9 レスポンスのパラメータ
名前 | サポートされているタイプ/値 |
---|---|
access_token | JWSトークン |
issued_token_type | urn:ietf:params:oauth:token-type:jwt |
token_type | Bearer |
expires_in | 有効期間(秒) |
scope | スペースで区切られたスコープ |
CURLコマンド
- TokenExchange属性を使用してアイデンティティ・ドメインを作成します
curl --location --request POST 'http://oamadminhost:oamadminport/oam/services/rest/ssa/api/v1/oauthpolicyadmin/oauthidentitydomain' \ --header 'Authorization: Basic YWRtaW46cGFzc3dvcmQ=' \ --header 'Content-Type: application/json' \ --data '{ \ "name": "CompanyDomain", \ "identityProvider": "oid", \ "description": "Updated Domain", \ "tokenSettings": [ \ { \ "tokenType": "ACCESS_TOKEN", \ "tokenExpiry": 3600, \ "lifeCycleEnabled": false, \ "refreshTokenEnabled": true, \ "refreshTokenExpiry": 86400, \ "refreshTokenLifeCycleEnabled": false \ }, \ { \ "tokenType": "AUTHZ_CODE", \ "tokenExpiry": 3600, \ "lifeCycleEnabled": false, \ "refreshTokenEnabled": true, \ "refreshTokenExpiry": 86400, \ "refreshTokenLifeCycleEnabled": false \ } \ ], \ "errorPageURL": "/oam/pages/servererror.jsp", \ "consentPageURL": "/oam/pages/consent.jsp", \ "keyPairRolloverDurationInHours": "24", \ "customAttrs": "{\"TokenExchange_DelegationEnabled\":\"true\",\"TokenExchange_DelegationClaimsToBeCopied\":\"mygroups\" ,\"TokenExchange_TokenExpiryInSeconds\":\"300\" }" \ }'
- 委任が許可されたclientidを持つターゲット・リソース・サーバーを作成します(既存のクライアントIDの更新が必要な場合は、リソース・サーバーを再作成します)
curl --location --request POST 'http://oamadminhost:oamadminport/oam/services/rest/ssa/api/v1/oauthpolicyadmin/application' \ --header 'Content-Type: application/json' \ --header 'Authorization: Basic YWRtaW46cGFzc3dvcmQ=' \ --data '{ \ "name": "PublishService_ResourceServer", \ "description": "Resource server for publish service", \ "scopes": [ \ { \ "scopeName": "publish", \ "description": "Publish the user profile" \ }, \ { \ "scopeName": "backup", \ "description": "Backup the user profile" \ } \ ], \ "tokenAttributes": [ \ { \ "attrName": "TokenExchange_AllowedClientsForDelegation", \ "attrValue": "PublishServiceClientId", \ "attrType": "static" \ } \ ], \ "idDomain": "CompanyDomain", \ "audienceClaim": { \ "subjects": [ \ "http://abc.publishservice.com" \ ] \ } }'
- TOKEN_EXCHANGE権限タイプでOAuthクライアントを作成します
curl --location --request POST 'http://oamadminhost:oamadminport/oam/services/rest/ssa/api/v1/oauthpolicyadmin/client' \ --header 'Content-Type: application/json' \ --header 'Authorization: Basic YWRtaW46cGFzc3dvcmQ=' \ --data '{ \ "attributes": [ \ \ ], \ "secret": "password", \ "id": "PublishServiceClientId", \ "scopes": [ \ "PublishService_ResourceServer.publish" \ ], \ "clientType": "CONFIDENTIAL_CLIENT", \ "idDomain": "CompanyDomain", \ "description": "Publish service client", \ "name": "PublishServiceClientName", \ "grantTypes": [ \ "CLIENT_CREDENTIALS", \ "TOKEN_EXCHANGE" \ ], \ "defaultScope": "PublishService_ResourceServer.publish", \ "redirectURIs": [ \ { \ "url": "https://oauthdebugger.com/debug", \ "isHttps": true \ } \ ] \ }
- TOKEN_EXCHANGEエンドポイントは次のとおりです:
http://<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token/exchange
- 委任リクエスト
curl --location --request POST 'http://<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token/exchange' \ --header 'X-OAUTH-IDENTITY-DOMAIN-NAME: CompanyDomain' \ --header 'Authorization: Basic UHVibGlzaFNlcnZpY2VDbGllbnRJZDp3ZWxjb21lMQ==' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --header 'charset: UTF-8' \ --data-urlencode 'grant_type=TOKEN_EXCHANGE' \ --data-urlencode 'subject_token=eyJraWQiOiJDb21wYW55RG9tYWluIiwieDV0IjoiSUliLTdDcnBxaDBGY1VseDVNekJZLWVXUTFVIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJodHRwOi8vYWJiaGF0b2QtaWRtc2UucmVnMi5zdXNlbmdkZXYxcGh4Lm9yYWNsZXZjbi5jb206MTQxMDAvb2F1dGgyIiwiYXVkIjpbImh0dHA6Ly9hYmJoYXRvZC1pZG1zZS5yZWcyLnN1c2VuZ2RldjFwaHgub3JhY2xldmNuLmNvbToxNDEwMC9vYXV0aDIiLCJodHRwOi8vYWJjLlVzZXJQcm9maWxlQXBwbGljYXRpb24uY29tIiwiVXNlclByb2ZpbGVBcHBsaWNhdGlvbl9SZXNvdXJjZVNlcnZlciJdLCJleHAiOjE2NzU2NjY2MjgsImp0aSI6IjJudWRVS01ZdUttbGZJUnRyNHF2TFEiLCJpYXQiOjE2NzU2NjMwMjgsInN1YiI6ImF3c3VzcjEiLCJjbGllbnQiOiJVc2VyUHJvZmlsZUNsaWVudElkIiwic2NvcGUiOlsiVXNlclByb2ZpbGVBcHBsaWNhdGlvbl9SZXNvdXJjZVNlcnZlci5yZWFkIiwiVXNlclByb2ZpbGVBcHBsaWNhdGlvbl9SZXNvdXJjZVNlcnZlci51cGRhdGUiXSwiZG9tYWluIjoiQ29tcGFueURvbWFpbiIsImdyYW50IjoiQVVUSE9SSVpBVElPTl9DT0RFIiwibXlncm91cHMiOiJvcmcxMDpvcmcxMjpvcmcxMTpvcmcxNDpvcmcxMzpvcmcxNjpvcmcxNTpvcmcxODpvcmcxNzpvcmcxOTpvcmc4Om9yZzk6b3JnNDpvcmc1Om9yZzY6b3JnNzpvcmcyMTpvcmcyMDpvcmcyMzpvcmcyMjpvcmcyNTpvcmcyNDphd3NncnAyOm9yZzE6b3JnMjphd3NncnAxOm9yZzMifQ.fV9aW9a1aocYdRvxZN_XX2AGfEuHz6aCnsc84wmV0dmq7MJhDHYY0u7Oa7_yKjgN2ZNPAp_atSYDf3yo48gdDS4-6OUgqUeXLgyrJyo0-eNBG1QEkQfZXm_lRdAWGaeAk0c5Wzk6Yj2NHmMBEFQ8cHx8tysz-CW21C42dy24g0rwgSek_9GXj7NLf2smZZge9asIogCGDQPIUsPdTFuGmrc0NX7u82kMfl2bZIdn1pBy9216tRRnlAOLuoE025uhZSury36ArYDGKumI4PXv5I07RBFC5VbrxfgnvCaM1zkwcBgCb_ei8BM7vz9TgOycKBhEg7-AiSChVbY2s8ldEA' \ --data-urlencode 'subject_token_type=urn:ietf:params:oauth:token-type:jwt \ ' \ --data-urlencode 'actor_token=eyJraWQiOiJDb21wYW55RG9tYWluIiwieDV0IjoiSUliLTdDcnBxaDBGY1VseDVNekJZLWVXUTFVIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJodHRwOi8vYWJiaGF0b2QtaWRtc2UucmVnMi5zdXNlbmdkZXYxcGh4Lm9yYWNsZXZjbi5jb206MTQxMDAvb2F1dGgyIiwiYXVkIjpbImh0dHA6Ly9hYmJoYXRvZC1pZG1zZS5yZWcyLnN1c2VuZ2RldjFwaHgub3JhY2xldmNuLmNvbToxNDEwMC9vYXV0aDIiLCJQdWJsaXNoU2VydmljZV9SZXNvdXJjZVNlcnZlciIsImh0dHA6Ly9hYmMucHVibGlzaHNlcnZpY2UuY29tIl0sImV4cCI6MTY3NTY2MzQyOSwianRpIjoiZll5VV9CcUNyeE9zdm5LRXpJdUNVQSIsImlhdCI6MTY3NTY1OTgyOSwic3ViIjoiUHVibGlzaFNlcnZpY2VDbGllbnRJZCIsImNsaWVudCI6IlB1Ymxpc2hTZXJ2aWNlQ2xpZW50SWQiLCJzY29wZSI6WyJQdWJsaXNoU2VydmljZV9SZXNvdXJjZVNlcnZlci5wdWJsaXNoIl0sImRvbWFpbiI6IkNvbXBhbnlEb21haW4ifQ.bCxSCclNKizykDtRZU2-CEseCCE8b9kFFJseq-xeKYxoaF3-V5hZgR5NND70zZsMHvArreAq37-ZtnWSm_rkOSb0TWxf7nfjdKhTAmKKIvyF0J1kfLwrF40cLfgdppmZQhXIyZuU1btxGO0d_ozheIv7yU60VR9Yyk5ukc4KdfFVDBAympu35s00nZG4kZ-uh4f5rm_R94fajS3aJaZvA_d7v-axisKnwgGthBWjhwa1IPJcgtS31pGSjQfsxShl9Or67aFQ1ZbTi9uHPm8ehUot9FKbrYhmcVzaj_M0pld4Scoqoc6_eZ4iaU3Jf4RiO_Jr-BLd5t6dfcdzbCUi-Q' \ --data-urlencode 'actor_token_type=urn:ietf:params:oauth:token-type:jwt \ ' \ --data-urlencode 'scope=PublishService_ResourceServer.publish'
- 偽装リクエスト
curl --location --request POST 'http://<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token/exchange' \ --header 'X-OAUTH-IDENTITY-DOMAIN-NAME: CompanyDomain' \ --header 'Authorization: Basic UHVibGlzaFNlcnZpY2VDbGllbnRJZDp3ZWxjb21lMQ==' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --header 'charset: UTF-8' \ --data-urlencode 'grant_type=TOKEN_EXCHANGE' \ --data-urlencode 'subject_token=eyJraWQiOiJDb21wYW55RG9tYWluIiwieDV0IjoiSUliLTdDcnBxaDBGY1VseDVNekJZLWVXUTFVIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJodHRwOi8vYWJiaGF0b2QtaWRtc2UucmVnMi5zdXNlbmdkZXYxcGh4Lm9yYWNsZXZjbi5jb206MTQxMDAvb2F1dGgyIiwiYXVkIjpbImh0dHA6Ly9hYmJoYXRvZC1pZG1zZS5yZWcyLnN1c2VuZ2RldjFwaHgub3JhY2xldmNuLmNvbToxNDEwMC9vYXV0aDIiLCJodHRwOi8vYWJjLlVzZXJQcm9maWxlQXBwbGljYXRpb24uY29tIiwiVXNlclByb2ZpbGVBcHBsaWNhdGlvbl9SZXNvdXJjZVNlcnZlciJdLCJleHAiOjE2NzU2NzAwOTksImp0aSI6IkFTM21pZktON0VBSHRzOUEtRjBBV0EiLCJpYXQiOjE2NzU2NjY0OTksInN1YiI6ImF3c3VzcjEiLCJjbGllbnQiOiJVc2VyUHJvZmlsZUNsaWVudElkIiwic2NvcGUiOlsiVXNlclByb2ZpbGVBcHBsaWNhdGlvbl9SZXNvdXJjZVNlcnZlci5yZWFkIiwiVXNlclByb2ZpbGVBcHBsaWNhdGlvbl9SZXNvdXJjZVNlcnZlci51cGRhdGUiXSwiZG9tYWluIjoiQ29tcGFueURvbWFpbiIsImdyYW50IjoiQVVUSE9SSVpBVElPTl9DT0RFIiwibXlncm91cHMiOiJvcmcxMDpvcmcxMjpvcmcxMTpvcmcxNDpvcmcxMzpvcmcxNjpvcmcxNTpvcmcxODpvcmcxNzpvcmcxOTpvcmc4Om9yZzk6b3JnNDpvcmc1Om9yZzY6b3JnNzpvcmcyMTpvcmcyMDpvcmcyMzpvcmcyMjpvcmcyNTpvcmcyNDphd3NncnAyOm9yZzE6b3JnMjphd3NncnAxOm9yZzMifQ.XNckHvnkRlblkkcuxWloNcahJ2eP2Yxv3LP6dJi9XlvIkR55Dm7H_LKOSouK2zogoIJBgryB9cNZ5M0MAS6DymQ-Nj8UxZAChgrJ7vIzMCHLFwizefIBYkE7LtYWqR2O0aeXnkqFkPgJ2bVpC3hut-7iGiMMlSERpMgJ15cYUGn3Dww6K-5uWMjoS06eFStdABcpW94wvdNEHkRGgR4rTLHjpuFttRkyU190e6BA0O2GbfmC7kbFX6q8ooC0pw6CmwpuM2ggmVcT7pF1Kyx_pkpYebFo5njqBS5ir9r18t-k4XHbQDvft-gtq0898vMw7t1WjO8otolaASwypjH8qg' \ --data-urlencode 'subject_token_type=urn:ietf:params:oauth:token-type:jwt \ ' \ --data-urlencode 'scope=PublishService_ResourceServer.publish'