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の設定: タスク・フロー

この項では、OAMにOAuthを設定する際の上位レベル・タスクについて説明します。まずアイデンティティ・ドメインを作成し、リソースを登録してOAuthを設定します。OAuthリソースはOAuthクライアントを登録する前に登録する必要があり、クライアントの登録時に、リソース情報として、特にAPIの詳細が必要とされます。

  1. REST APIコールを使用してアイデンティティ・ドメインを作成するには、「アイデンティティ・ドメインの作成」を参照してください

  2. REST APIコールを使用して新しいリソースを登録するには、「リソースの作成」を参照してください

  3. リソースを登録したら、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の名前と説明のみが使用されます。残りの値はデフォルトに設定されます。

  • 詳細: このモードでは、様々なパラメータに特定の値を指定できます。

  1. 簡易モードでドメインを作成するためのサンプルの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"}'
    
    
  2. 詳細モードでスコープを使用してドメインを作成するためのサンプルの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_TOKENAUTHZ_CODESSO_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以降のリリース。この内容は、OAMバンドル・パッチ12.2.1.4.210920以降のリリースにのみ適用されます。

サードパーティ証明書を使用してアクセス・トークンに署名できるようにするには、次のステップを実行します:

  1. 必要なキー・ペアをサーバーにアップロードし、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の追加に関する項を参照してください。

  2. defaultSigningKeyPairおよびkeyPairRolloverDurationInHoursを使用して、キー・ペアを必要なOAuthアイデンティティ・ドメインに関連付けます。

    たとえば、

    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を使用して、承認の有効期間を有効化、無効化または変更できます。

すべてのOAuthアイデンティティ・ドメインに対して承認管理を有効化するには、OAMの起動時にconsentExpiryTimeInMinutesシステム・プロパティを追加します。
  1. すべての管理サーバーおよび管理対象サーバーを停止します。
  2. $OAM_DOMAIN_HOME/bin/setDomainEnv.shを編集し、次に示すように、EXTRA_JAVA_PROPERTIESの下にconsentExpiryTimeInMinutesプロパティを追加します
    EXTRA_JAVA_PROPERTIES="-DconsentExpiryTimeInMinutes=10"
  3. 管理サーバーおよび管理対象サーバーを開始します。

ノート:

システム・プロパティは、各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を使用します。
  1. スコープを使用してリソースを作成するためのサンプルのcurlコマンドは、次のとおりです。
    {"name":"ResServer1","description":"TestResourceServer","scopes":[{"scopeName":"scope1","description":"ViewPage"},{"scopeName":"scope2","description":"UpdatePage"},{"scopeName":"scope3","description":"ModifyPage"}],"tokenAttributes":[{"attrName":"sessionId","attrValue":"$session.id","attrType":"DYNAMIC"},{"attrName":"resSrvAttr","attrValue":"RESOURCECONST","attrType":"STATIC"}],"idDomain":"TestDomain1","audienceClaim":{"subjects":["ab0"]}}

    OAuth REST APIの詳細は、『Oracle Access ManagerでのOAuth REST API』を参照してください。

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を使用します。
  1. スコープを使用してクライアントを作成するためのサンプルのcurlコマンドは、次のとおりです。
    {"attributes":[{"attrName":"customeAttr1","attrValue":"CustomValue","attrType":"static"}],"secret":"welcome1","id":"TestClient","scopes":["ResServer1.scope1"],"clientType":"CONFIDENTIAL_CLIENT","idDomain":"TestDomain1","description":"Client Description","name":"TestClient","grantTypes":["PASSWORD","CLIENT_CREDENTIALS","JWT_BEARER","REFRESH_TOKEN","AUTHORIZATION_CODE"],"defaultScope":"ResServer1.scope1","redirectURIs":[{"url":"http://localhost:8080/Sample.jsp","isHttps":true}]}

    OAuth REST APIの詳細は、『Oracle Access ManagerでのOAuth REST API』を参照してください。

38.3 ユーザー・ロック検証の有効化

ユーザーがロックまたは無効化されたときにトークンを無効化するために、ユーザー・ロックの検証を有効にする必要があります。

ユーザーがロックまたは無効化されると、OAuthユーザー検証フローが失敗します。OAuthユーザー検証は、OAuth認可付与、JWTベアラー付与、リフレッシュ・トークン付与およびアクセス・トークン検証フロー中に実行されます。

たとえば、ユーザー・ロック検証を有効にすることで、アクセス・トークン(リフレッシュ・トークンを使用)が、ロックまたは無効化されたユーザーに対して発行されなくなります。

前提条件

進める前に、次のステップを実行して、LDAPNoPasswordValidationSchemeOAuth認証スキームが存在するかどうかを確認します。
  1. Oracle Access Managementコンソールにログインします。
  2. Oracle Access Managementコンソールの右上で「アプリケーション・セキュリティ」をクリックします
  3. 「アプリケーション・セキュリティ」起動パッドで、「Access Manager」の下の「認証スキーム」をクリックします
  4. LDAPNoPasswordValidationSchemeOAuthという名前を指定し、「検索」をクリックします。
  5. 検索で認証スキームが返されるかどうかに応じて、次のいずれかを実行します。

38.3.1 LDAPNoPasswordValidationSchemeOAuthが存在する場合のユーザー・ロック検証の有効化

ユーザー・ロック検証を有効にするには、次のステップを実行します。

  1. Oracle Access Managementコンソールにログインします。
  2. Oracle Access Managementコンソールの右上で「構成」をクリックします。
  3. 「ユーザー・アイデンティティ・ストア」をクリックします
  4. 「OAM IDストア」の下で、ユーザー・アイデンティティ・ストアを選択し、「編集」をクリックします。
  5. 「ネイティブIDストア設定の使用」の横のボックスを選択します。
  6. 「パスワード管理」の下で、「パスワード管理の有効化」の横のボックスを選択します。

これらのパラメータの詳細は、「ユーザー・アイデンティティ・ストア設定」を参照してください

38.3.2 LDAPNoPasswordValidationSchemeOAuthが存在しない場合のユーザー・ロック検証の有効化

ユーザー・ロック検証を有効にするには、次のステップを実行します。

  1. 「LDAPNoPasswordValidationSchemeOAuthが存在する場合のユーザー・ロック検証の有効化」で説明されているステップに従います。
  2. 新しい認証スキームを作成します(LDAPNoPasswordValidationSchemeOAuthなど。名前には任意の文字列を使用できます):
    1. Oracle Access Managementコンソールの右上で「アプリケーション・セキュリティ」をクリックします
    2. 「アプリケーション・セキュリティ」起動パッドで、「Access Manager」の下の「認証スキーム」をクリックします
    3. 「認証モジュール」のドロップダウンで、PasswordPolicyValidationModuleOAuthを選択します

      ノート:

      PasswordPolicyValidationModuleOAuthは、OAMインストールですぐに使用できます。
    4. 認証スキームに、チャレンジ・パラメータnoAuthnCheckForPwdManagement=trueを設定します。
    5. 認証スキームに、他のパラメータを設定します。たとえば、次の図は、認証スキーム・ページのサンプルを示しています:ユーザー・ロック検証の認証スキーム
  3. 作成した新しいスキームで認証ポリシーを更新します。
    1. 「アプリケーション・セキュリティ」起動パッドで、「Access Manager」の下の「アプリケーション・ドメイン」をクリックします
    2. 「検索」をクリックし、「検索結果」の下で「IAM Suite」をクリックします
    3. IAMスイート・アプリケーション・ドメインで、「認証ポリシー」タブをクリックし、OAuthアサーション・ポリシーをクリックします
    4. 「認証スキーム」のドロップダウンで、作成した新しいスキームを選択します。たとえば、LDAPNoPasswordValidationSchemeOAuthです
    5. 「適用」をクリックします。

38.4 MDCでの承認管理の有効化

この項のステップに従って、MDCで承認管理を有効にします。

ノート:

既存のMDC構成の承認管理を有効にするには、MDCを再構成する必要があります。
  1. 2つのOAM環境、DC1 (マスター)とDC2 (クローン)を設定します。
  2. マスターのOAuthアイデンティティ・ドメインにconsentExpiryTimeInMinutesパラメータを設定します。詳細は、「承認管理の有効化」を参照してください。
  3. マルチデータ・センターでOAuthを構成します。詳細は、「マルチデータ・センターでのOAuthの構成」を参照してください
  4. 自動ポリシー同期を有効にします。詳細は、「自動ポリシー同期の有効化」を参照してください

38.5 マルチデータ・センターでのOAuthの構成

REST APIを使用してマルチデータ・センター(MDC)でのOAuthサポートを構成できます。

次のシナリオは、REST APIを使用してMDC環境でOAuthを構成するフローを例示しています。ここに示した順番で、次の手順を実行します。
  1. OAuthアーティファクト(マスターDC上のアイデンティティ・ドメイン、リソース・サーバー、クライアントおよび関連付けられた信頼アーティファクト)を作成します。

  2. 「マルチデータ・センターの構成」で示したステップに従って、2つのデータ・センター間にMDCを設定します。

    ノート:

    ステップ2の一部として、マスター上でexportAccessStore、クローンDC上でimportAccessStoreの各リクエストが実行されます。これにより、マスターDC上に作成されるアーティファクトをクローンDC上で認識できることが保証されます。ステップ2では、OAuthアーティファクトがクローンDCにコピーされることも保証されます。

  3. クローンDC上でこれらのアーティファクトのGETコマンドを実行して、OAuthがMDCモードで正常に設定されたことを確認します。

  4. 自動ポリシー同期の有効化

  5. 次に、2段階のフローを実行してMDCフローを検証します。

    1. パスワード付与フローの一環として、DC1上にアクセス・トークンを作成します。

    2. 検証のためにクローンDCエンドポイントに同じトークンを送信します。

    3. トークンはDC2上で有効である必要があります。

38.6 マルチデータ・センターでの承認管理のオプション・パラメータ

クローン・データ・センターのランタイム・サーバーのシステム・プロパティで、次のオプション・パラメータを設定できます。

  1. すべての管理サーバーおよび管理対象サーバーを停止します。
  2. $OAM_DOMAIN_HOME/bin/setDomainEnv.shを編集し、EXTRA_JAVA_PROPERTIESの下にパラメータを追加します。
    たとえば、
    EXTRA_JAVA_PROPERTIES="-DconsentExpiryTimeInMinutes=10"
  3. 管理サーバーおよび管理対象サーバーを開始します。

表38-2 MDCでの承認管理のオプション・パラメータ

パラメータ デフォルト値 説明
failOnConsentStoreError true

デフォルトでは、マスターDCが使用できない場合、ユーザー承認リクエストは処理されず、ユーザーにエラーが表示されます。

エラーをオフにするには、パラメータの値をfalseに設定します。ただし、エラーはログに存在します。

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の値よりも大きく設定する必要があります

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)に動的に登録する方法を提供します。

38.8.1 動的クライアント登録の有効化

動的クライアント登録(DCR)は、アイデンティティ・ドメイン・レベルで有効にする必要があります。

次に示すように、管理サーバーのOAuth APIを使用し、カスタム属性isDcrRegEnabledtrueに設定して、アイデンティティ・ドメインを作成します。

ノート:

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)に動的に登録する必要のあるモバイル・デバイス・アプリケーションは、最初に登録トークンを取得する必要があります。

動的クライアント登録(DCR)を有効にして、OAuthクライアント・テンプレートを作成する必要があります。

登録トークンを取得するプロセス・フロー

  1. ユーザーがモバイル・デバイスでネイティブ・アプリケーションを開きます
  2. ネイティブ・アプリケーションに「登録」ボタンが表示されます
  3. ユーザーが「登録」ボタンをクリックすると、登録トークンURIを使用してブラウザが起動されます。OAuthサーバーへのリクエストには、domain_nameおよびtemplate_idが含まれます。
  4. ユーザーは、構成されている認証ポリシーに基づいて、ログイン・フォームにリダイレクトされます。
  5. 認証に成功すると、OAuthサーバーによって登録トークンが生成され、この登録トークンがリクエストに基づいてトークンまたはQRコードとして返されます。
  6. ネイティブ・アプリケーションは、この登録トークンを使用して、クライアントの登録を続行できます。

図38-1 登録トークンを取得するためのフロー図

登録トークンを取得するためのフロー図

登録トークンのサンプル・リクエスト

モバイル・デバイスでユーザー(またはリソース所有者)がアプリケーションを開いたら、アプリケーションは、/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

表38-4 登録トークンのサンプル・レスポンス

構成 サンプル・レスポンス

リダイレクトURIがクライアント・テンプレートで定義されています。

この場合、response_typeパラメータ(渡された場合)は無視されます。

<redirect_uri from template>?access_token=<registration access token value>
リダイレクトURIは存在せず、response_typeは渡されないか、トークンとして渡されます。
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-cache
Pragma: no-cache
{
  "access_token":"token value",
  "token_type":"Bearer",
  "expires_in":1800
}
リダイレクトURIは存在せず、response_typeがQRコードとして渡されます
HTTP/1.1 200 OK
Content-Type: image/png
Cache-Control: no-cache
Pragma: no-cache
<QR Code Image in png format>
次の表は、エラー発生時のレスポンスを示しています:

表38-5 登録トークンのエラー・レスポンス

シナリオ HTTPステータス・コード エラー・メッセージ セカンダリ・メッセージ
OAuthサービスが無効 403 Unauthorized Unauthorized
動的クライアント登録が無効 403 Unauthorized Unauthorized
必須フィールドが未入力 400 Invalid Request Required fields are missing
無効なドメイン 400 Invalid Request Invalid Domain
無効なクライアント:
  • 名前に接頭辞DCR_REG_STUB_がない
  • 渡されたクライアントが存在しない
400 Invalid Request Invalid Client
無効なレスポンス・タイプ 400 Invalid Request Unsupported Response Type
渡されたクライアントにDCRフローを実行する権限がない 403 UnAuthorized Client UnAuthorized client

38.8.4 登録トークンを使用したクライアントの登録

登録トークンを使用して、クライアントをOAuthサーバー(OAM)に登録します。

クライアント登録のプロセス・フロー

  1. ネイティブ・アプリケーションは、クライアントを登録するために、登録トークンを含むリクエストをOAuthサーバーに送信します。
  2. OAuthサーバーは、トークンを検証してクライアントを登録します。クライアント・プロファイルには次のフィールドがあります:

図38-2 クライアント登録のフロー図

クライアント登録のフロー図

クライアント登録のサンプル・リクエスト

クライアントとして登録するには、アプリケーションで/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

クライアント登録のサンプル・レスポンス

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:
  • expired
  • malformed
  • invalid
  • revoked
サーバーで失敗 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セッションのリンクのユースケース・フローを示します。

図38-3 OAuthトークンに対するSSOセッションのリンクのユースケース・フロー

図38-3の説明が続きます
「図38-3 OAuthトークンに対するSSOセッションのリンクのユースケース・フロー」の説明

SSOセッションのリンクのためのサーバー変更

SSOのリンクしたJWTトークンの作成
  1. SSOセッションが作成されると、JWTユーザー・トークンも作成されます。JWTユーザー・トークンには、その要求の一部としてSSO "session_id"が含まれます。

  2. このJWTトークンの作成は、構成に基づきます。作成したら、このトークンは、Cookieまたはヘッダーとしてダウンストリーム・アプリケーションに送信できます。現在、構成は、スキーム・レベルのチャレンジ・パラメータとして設定されます。

    デフォルトでは、SSOリンクJWTトークンはCookieで設定されます。

    ノート:

    OAUTH_TOKEN_RESPONSE_TYPEheaderの場合、JWTトークンはCookie名JWTAssertionで設定されます。

    OAUTH_TOKEN_RESPONSE_TYPEcookieの場合、JWTトークンはCookie名OAUTH_TOKENで設定されます。

    ssolink_challengparam.pngの説明が続きます
    図ssolink_challengparam.pngの説明
  3. トークン署名: 起動時に、デフォルトのOAuthキー証明書がサーバーにブートストラップされます。JWTトークンは、アイデンティティ・ドメインの秘密キーで署名されます。JWTトークンがアサーションとして受信されると、X5T値がヘッダーから取得され、トークンの検証に使用できる関連する公開キーがフェッチされます。

SSOのリンクしたJWTトークンの検証
  1. トークンがOAuthトークン・リクエストのJWTベアラー・フローの一部として戻されると、OAMサーバーは、トークンからSSO "session_id"を取得します。

  2. 有効なセッションのチェック: JWTトークンにセッションIDが含まれる場合、サーバーは、それをSSOのリンクしたJWTトークンであると認識します。それは、トークンから"sessionId"要求を取得し、指定されたIDを持つサーバー・セッションがまだ有効であるかどうかをチェックします。

  3. セッションが有効な場合、SSOセッションのサブジェクトが、JWTトークンの"sub"フィールドと比較されます。これが一致した場合、このユーザーのアクセス・トークンが生成され、クライアントに返されます。

MDCフローでのSSOのリンクしたJWTトークンの検証
  1. MDC対応環境の場合、JWTトークン作成の一環として、別の要求である"mdc_sso_link"もトークンに追加されます。この要求には、セッションが固定されているマシンのclusterIdと、UserIdentityStore参照が含まれます

  2. トークンがOAuthトークン・リクエストのJWTベアラー・フローの一部として戻されると、OAMサーバーは、トークンからSSOセッションIDを取得します。

  3. 有効なセッションのチェック: JWTトークンにセッションIDが含まれる場合、サーバーは、それをSSOのリンクしたJWTトークンであると認識します。それは、トークンから"sessionId"要求を、mdc_sso_link要求からclusteridを取得し、セッションを取得します。セッションの有効性をチェックする通常のMDCフローは、ここで維持されます。

  4. セッションが有効な場合、SSOセッションのサブジェクトが、JWTトークンの"sub"フィールドと比較されます。これが一致した場合、このユーザーのアクセス・トークンが生成され、クライアントに返されます。

セッションのIdleTimeOutとSSOのリンクしたトークン 

セッションが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
2-leggedフロー
  1. リソース所有者の資格証明の使用

    次に、サーバーに対するサンプル・リクエストを示します。

    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として指定できます。

  2. クライアント資格証明の使用

    次に、サーバーに対するサンプル・リクエストを示します。

    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'
  3. 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'
  4. リフレッシュ・トークンの使用

    次に、サーバーに対するサンプル・リクエストを示します。

    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>'
  5. 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フロー — プロセス

3-leggedフローを実現するためには、続行する前にOAMサーバーとWebゲートの両方でいくつかの手動ステップを実行する必要があります。承認ページと承認者ページは、OAMを使用して保護する必要があります。承認ページをカスタマイズする場合、Webゲートで保護する必要があります。

  • OAMサーバー - 作成されたアプリケーション・ドメインで、指定されたステップの説明に従っていくつかの3-leggedリソースを追加する必要があります。

  • Webゲート - この項の説明に従ってmod_wl_ohs.confを変更します。

OAMサーバー側で実行するステップ

  1. 3-leggedの設定の一環として追加するすべてのリソースのリスト。それぞれのリソースの詳細は、ステップ2を参照してください。

    all_resources.pngの説明が続きます
    図all_resources.pngの説明
  2. リソース"/oauth2/rest/approval"を作成します。これは、Webゲートで保護する必要があります。

    3legged11.pngの説明が続きます
    図3legged11.pngの説明
  3. リソース"/oauth2/rest/approval/skip"を作成します。これは、Webゲートで保護する必要があります。

    Webゲートによって保護されているリソース"/oauth2/rest/approval/skip"の作成を示すサンプル。
  4. 即時利用可能な承認ページであるリソース"/oam/pages/consent.jsp"を作成します。カスタム承認ページを使用する場合、それはWebゲートで保護し、ここで適切なリソースを追加する必要があります。

    consent_resource.pngの説明が続きます
    図consent_resource.pngの説明
  5. リソース"/oauth2/rest/**"を作成し、「保護レベル」「除外」としてマークします。

    3legged3.pngの説明が続きます
    図3legged3.pngの説明
  6. リソース"/oam/**"を作成し、「保護レベル」「除外」としてマークします。

    oam_resource.pngの説明が続きます
    図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フロー

  1. ブラウザ・リクエストの認可コードの使用

    次に、サーバーに対するサンプル・リクエストを示します

    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 
  2. 認可コードを使用したアクセス・トークンの生成

    次に、サーバーに対するサンプル・リクエストを示します

    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の変更の詳細は、「クローン・データ・センターでのポーリング間隔の変更」を参照してください

    また、BatchSize300に設定することもお薦めします。詳細は、 表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の変更の詳細は、「クローン・データ・センターでのポーリング間隔の変更」を参照してください

    また、BatchSize300に設定することもお薦めします。詳細は、 表19-2を参照してください

    MDC設定では、この管理者REST APIをマスター・ノードで実行する必要があります。

次のヘッダーがリクエストに追加されていることを確認します:
  • Authorization : Base64 URLエンコードの<Administrator>:<Secret>の組合せ。
  • X-OAUTH-IDENTITY-DOMAIN-NAME: アイデンティティ・ドメイン名。
  • Content-Type: application/x-www-form-urlencoded: 必要に応じて、次のパラメータをキーと値のペアとしてリクエスト本文に追加します。

ノート:

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を取り消すには、userIdrevoke_typeclientIdentifierresServerIdを指定します。

サンプル・リクエスト
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以降のリリース。この内容は、OAMバンドル・パッチ12.2.1.4.210920以降のリリースにのみ適用されます。

OAMでは、次のクライアント認証方法がサポートされています:
  • 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を構成する必要があります。
アイデンティティ・ドメインには様々なタイプのクライアントを含めることができるため、アイデンティティ・ドメインに複数の認証方法を構成できます。次に、認証方法の優先順位を示します:
  1. mTLS認証方法: tls_client_authおよびself_signed_tls_client_auth
  2. JWTキー認証方法: private_key_jwt
  3. クライアント・シークレット認証方法: 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クライアント認証の構成

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構成に基づいて行われます。

証明書バインディングを構成するには、アイデンティティ・ドメインまたはクライアントを作成または変更するときに、issueTLSClientCertificateBoundAccessTokenstrueまたはfalseとして設定します。

証明書バインド・アクセス・トークンには、アクセス・トークンがバインドされているクライアント証明書の拇印を含むcnf (確認)エントリが含まれます。

イントロスペクト・エンドポイントを使用して、証明書バインディングを検証できます。

ノート:

cnfエントリは、証明書バインド・アクセス・トークンを持つイントロスペクト・エンドポイントのレスポンスにのみ存在し、証明書にバインドされていないアクセス・トークンには存在しません。

38.13.2 mTLSエンドポイントの構成

前提条件: mTLSエンドポイントを構成する前に、次の手順を実行したことを確認してください:
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クライアント証明書の検証では、次のステップを実行します:
  1. 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="
    }
  2. OCSP証明書検証を有効にします。詳細は、「OCSP証明書検証の有効化」を参照してください

38.13.4 mTLSをサポートする追加オプションの構成

mTLS認証をサポートするための追加構成を実行します

  • 「WebLogicプラグインの有効化」を「はい」に設定します。
    1. WebLogicコンソールにログインし、サーバー・インスタンスに移動します(たとえば、oam_server1Advanced)
    2. 「クライアント証明書プロキシの有効化」チェック・ボックスを選択します
    3. 「WebLogicプラグインの有効化」オプションを「はい」に設定します
  • SSLがOHSで終了した場合、MIDDLEWARE_HOME/user_projects/domains/base_domain/config/fmwconfig/components/OHS/instances/ohs1の下にあるohs ssl.confファイルで次の変更を実行します:
    • SSLウォレットで、"${ORACLE_INSTANCE}"を検索し、次の行でSSLOptionsStdEnvVarsおよびExportCertDataを追加します。
    • SSLVerifyClient noneSSLVerifyClient requireに変更します
  • 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認証フローの例を示しています:

  1. アイデンティティ・ドメインを作成します
    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"
    }'
  2. リソースを作成します
    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"
            ]
        }
    }'
  3. クライアントを作成します:
    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"
    }'
  4. 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"
    }'
  5. 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'
  6. イントロスペクト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認証フローの例を示しています:

  1. アイデンティティ・ドメインを作成します
    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"
    }'
  2. リソースを作成します
    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"
            ]
        }
    }'
  3. クライアントを作成します
    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"
    }'
  4. 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"
    }'
  5. 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から認証コードを取得します。

  6. 前のステップの認証コードを使用してアクセス・トークンをフェッチします
    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'
    
  7. イントロスペクト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_codeclient_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の有効化

ドメイン・レベルでPKCEを有効にするには、customAttrsUsePKCEを追加し、それを次のいずれかの値に設定します:
動作と説明
ALL_CLIENTS_TYPES

すべてのクライアント・タイプに対してPKCEが有効になります。

authorization_codeおよびtoken_accessリクエストでPKCEパラメータcode_verifierおよびcode_challengeが指定されていない場合、認可フローはnon-PKCE 3-legged OAuthフローに切り替わり、完了します。

ALL_CLIENTS_TYPES_STRICT

すべてのクライアント・タイプに対してPKCEが有効になります。

authorization_codeおよびtoken_accessリクエストでPKCEパラメータcode_verifierおよびcode_challengeが指定されていない場合、認可は失敗します。

PUBLIC_CLIENTS

PUBLIC_CLIENTSに対してのみPKCEが有効になります。

authorization_codeおよびtoken_accessリクエストでPKCEパラメータcode_verifierおよびcode_challengeが指定されていない場合、認可フローはnon-PKCE 3-legged OAuthフローに切り替わり、完了します。

パブリックでないクライアントに対してPKCEパラメータを使用した場合は、無視されます。

PUBLIC_CLIENTS_STRICT

PUBLIC_CLIENTSに対してのみPKCEが有効になります。

authorization_codeおよびtoken_accessリクエストでPKCEパラメータcode_verifierおよびcode_challengeが指定されていない場合、認可は失敗します。

次の例は、ドメインの作成時に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の有効化

クライアント・レベルでPKCEを有効にするには、UsePKCEパラメータを次のいずれかの値に設定します:
動作と説明
STRICT

authorization_codeおよびtoken_accessリクエストでPKCEパラメータcode_verifierおよびcode_challengeが指定されていない場合、認可は失敗します。

NON_STRICT

authorization_codeおよびtoken_accessリクエストでPKCEパラメータcode_verifierおよびcode_challengeが指定されていない場合、認可フローはnon-PKCE 3-legged OAuthフローに切り替わり、完了します。

次の例は、クライアントの作成時に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フローについて詳細に説明します。

  1. customAttrsUsePKCEを追加して、アイデンティティ・ドメインを作成または更新します。詳細は、「ドメイン・レベルでのPKCEの有効化」を参照してください
  2. リソース・サーバーがすでに存在する場合は、このステップをスキップします。そうでない場合は、「リソースの作成」の説明に従ってリソース・サーバーを追加します。
  3. UsePKCEパラメータを追加して、OAuthクライアントを作成または更新します。詳細は、「クライアント・レベルでのPKCEの有効化」を参照してください
  4. OAuth 3-leggedフローがすでに設定されている場合は、このステップをスキップします。そうでない場合は、「OAuth 12cのランタイムREST API」「3-leggedフロー — プロセス」の項の説明に従って、OAMサーバーおよびWebゲートで手動のサイド・ステップを実行します
  5. 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は、後でアクセス・トークンをリクエストするために使用されます。

  6. code_verifierからcode_challenge文字列を生成します。

    code_challengeは、code_verifierのSHA256ハッシュの変換済BASE64-URLエンコード文字列です。

    たとえば、code_verifierY1lgBSx8gRsruplrdpGiG-9Lkv~kna1q2pgwXY7UYKc~~jTgMkmUlZkZkapJGT6X.m12.ZUBDj24qWuPGHl21x3vyFEC.m_XDH_JTw4Qk6_a62Qw~e0sVp3I-AHYhTznの場合、変換済のSHA256ハッシュ文字列のcode_challengeは、Ec-YfJRRibqf_myiWqObZfT-M1HthBUTygBH73zEHbcになります。

  7. ブラウザを使用して、認可コードをリクエストします。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
  8. 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つの値が一致した場合にのみ、アクセス・トークンが発行されます。
  9. アクセス・トークンを検証します。

    アクセス・トークンのサンプル・リクエストの検証

    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_tokenmay_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が必要です:
名前 デフォルト
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コマンド

次に、アイデンティティ・ドメイン、ターゲット・リソース・サーバー、OAuthクライアント、委任リクエストおよび偽装リクエストを作成または変更するCURLコマンドの例をいくつか示します。
  1. 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\"  }" \
    }'
  2. 委任が許可された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"                         \
            ]                                                           \
        } }'
  3. 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                                         \
            }                                                           \
        ]                                                               \
    }
  4. TOKEN_EXCHANGEエンドポイントは次のとおりです:
    http://<ManagedServerHost>:<ManagedServerPort>/oauth2/rest/token/exchange
  5. 委任リクエスト
    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'
  6. 偽装リクエスト
    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'