OAuthプロバイダの構成
OAuthの紹介
ロール
-
リソース所有者: リソースへのアクセス権を付与できるアプリケーションまたはユーザー。
-
リソース・サーバー: リソースがホストされているAPIサーバー。 アクセス・トークンを使用するリクエストを受け入れて応答できます。
-
クライアント・アプリケーション: リソース所有者のかわりにリソース・リクエストを作成するアプリケーション。
-
承認サーバー: リソース所有者が認証され、認可が取得された後に、クライアントにアクセス・トークンを発行するサーバー。
アプリケーションをOAuthサービスに登録すると、一意のクライアントIDとクライアント・シークレットを取得できます。 クライアントIDは、ユーザー名のようなもので、パブリック・エクスポージャ用です。 Javascriptソース・コードに含めることも、ログインURLの作成にも使用できます。 クライアント・シークレットは、パスワードのようなもので、アプリケーションがアクセス・トークンをリクエストするときに使用されます。 アプリケーションは、認可サーバーからトークンを受信するためにクライアント・シークレットを知っている必要があります。 クライアント・シークレットは保護する必要があります。
トークンの検証に加えて、スコープを使用したAPIへのアクセスを制限できます。 HTTPメソッド(GET、PUT、POSTおよびDELETE)ごとのアクセスを特定のスコープに制限することもできます。 「OAuth 2.0ポリシーの適用」を参照してください
Oracle API Platform Cloud Serviceサポートを行うOAuthプロバイダ
Oracle API Platform Cloud Serviceのこのリリースでは、トークンの書式がJWTの場合に、RFC7519に基づいて、OAuthプロバイダからトークンを消費できます。
OAuthポリシーは、JWTアクセス・トークンをアサートし、RFC7519で定義されているさまざまな標準クレームを検証します。 次に、検証される標準要求を示します。
-
"iss": トークンの発行者が有効であることを確認します。
-
"sub": トークンを作成したユーザーを確認します。
-
"aud": トークンが作成されたユーザーを確認します。
-
"exp": トークンの有効期限と時間をチェックします。
-
"nbf": トークンの有効日および有効でない時間を確認します。
-
"iat": トークンの発行時間を確認します。
-
"jti": トークンの一意のIDをチェックします。 これはオプションです。
JWT仕様の詳細は、https://tools.ietf.org/html/rfc7519#section-4.1を参照してください
Oracle API Platform Cloud Serviceでは、「JWSコンパクト・シリアル化」形式によりJWTトークンに署名する必要があります。 https://tools.ietf.org/html/rfc7515#section-3を参照してください。
プロバイダの構成
OAuthプロバイダの場合は、リソース・アプリケーションとクライアント・アプリケーションの2つのアプリケーションを作成します。 リソース・アプリケーションを作成するときに、プライマリ・オーディエンスと、アプリケーションを保護する必要があるスコープを追加します。 クライアント・アプリケーションを作成するときに、リソース所有者資格証明、クライアント資格証明、許可コード、暗黙的などの様々な権限付与タイプを定義し、リソース・サーバー・アプリケーションからスコープを設定します。
OAuthフロー
クライアント・アプリケーションは、アイデンティティ・プロバイダによって認証され、アクセス・トークンを受け取ります。 クライアント・アプリケーションは、トークンをゲートウェイ・ノードに送信します。ゲートウェイ・ノードは、OAuthエンフォルサとして機能し、トークンを検証します。 トークンが有効な場合、リクエストは保護されたリソースに渡されます。

「図ouath-flow.pngの説明」
OAuthポリシー施行
JSON Webトークン(JWT)は、以下を使用して検証されます:
-
JWTには発行者(iss)要求が含まれている必要があります。
-
JWTにはオーディエンス("aud")クレームが含まれている必要があります。
-
JWTには、発行済(iss)および失効(exp)時間が含まれている必要があります。
-
JWTは、メッセージの整合性を確保するためにデジタル署名する必要があります。 予想は、非対称的に署名されるべきです。
-
スコープは、JWTでスコープとして定義する必要があります。 スコープの主張は、スコープの主張の値がスペースで区切られた文字列です。 スコープ要求についてカスタマイズした名前がある場合は、プロファイルXMLファイルの
ScopeClaimName
要素を使用してそれを定義できます。 「OAuthプロファイルXMLファイル」を参照してください。
ノート:
サブジェクト(" sub ")要求はオプションです。基本ステップ
- OAuthリソースを作成します。
- クライアント・アプリケーションがリソースにアクセスできるようにします。
- OAuthトークンを取得します。
Oracle API Platform Cloud Serviceを使用した例
Oracle Identity Cloud Serviceによってアクセス・トークンが提供されている場合は、次のステップに従ってリソースを保護します。
-
リソース・サーバーのエンドポイントとして、プライマリ・オーディエンスを持つリソース・サーバー・アプリケーションをOracle Identity Cloud Serviceに作成します。 ロード・バランシングURLを含む完全なAPIエンドポイントを入力します。
-
リソースのスコープを定義します。
「図resource-server2.pngの説明」 -
必要な権限を持つクライアント・アプリケーションをOracle Identity Cloud Serviceで作成します。
-
リソース・サーバー・アプリケーションから、その特定のリソースに対して許可されているスコープを追加します。 定義した許可スコープが、アプリケーションで定義されているスコープと一致することを確認してください。
「図client-configuration2.pngの説明」
ゲートウェイ構成
-
構成.xmlファイルを作成します。 「OAuthプロファイルXMLファイル」を参照してください
-
構成ファイル内にOracle Identity Cloud Serviceインスタンスの公開キーを追加し、Oracle Identity Cloud Serviceインスタンスに対するその他の必須要求を構成します。
公開キーを入手するには、REST API for Oracle Identity Cloud Serviceの「テナント署名証明書をJWK形式で取得」を参照してください。
-
リソースAPIを保護するには、ポリシー・チェーンの開始時にOAuthポリシーを追加します。 「OAuth 2.0ポリシーの適用」を参照してください
-
APIをデプロイします。
OAuthプロファイルXMLファイル
OAuthプロファイルXMLファイルを構成する方法を学習します。 ゲートウェイ・ノードは、このファイルを使用して、クライアントがOAuth 2.0ポリシーによって保護されているAPIにリクエストを送信するアクセス・トークンを認証します。
updateoauthprofileゲートウェイ・インストーラ・アクションまたは「Oracle API Platform Cloud Serviceのゲートウェイ・コントローラのREST API」の「セキュリティ・プロファイルの更新」操作を使用して、OAuthプロファイルをゲートウェイ・ノードにアップロードします。
要素 | 説明 |
---|---|
|
使用するOAuthプロファイルのタイプ。 サポートされる値は、
|
|
アイデンティティ・プロバイダ発行者。 |
|
IDトークンの渡しに使用するヘッダー・クライアントを指定します。 これは、OAuthプロバイダが2つのトークンを作成する場合に便利です: アクセス・トークンとIDトークン。
|
|
trueに設定すると、アクセス・トークンのオーディエンス制限は、 |
|
trueに設定すると、OAuthポリシーは、ホスト名がロード・バランサURLである完全なURLに基づいてオーディエンス制限検証を実行します。 falseに設定すると、OAuthポリシーは、サービスが消費されるパス情報のみに基づいてオーディエンス制限検証ベースを実行します。 本番システムでこのフラグをtrueに設定することをお勧めします。
ノート: この要素がtrueに設定されている場合は、 |
|
この要素がtrueに設定されている場合、APIの消費URL全体がクレーム・セットで定義されたオーディエンスから始まる場合、OAuthポリシーはオーディエンス制限の検証を実行します。 |
|
|
|
JWTがアクセス・トークン内に含める必要がある要求のリスト。 |
|
ゲートウェイがアイデンティティ・プロバイダの認証に使用する公開キーを含みます。 |
|
PEM形式の公開鍵。 |
|
X509形式の公開キー。 |
|
JWK形式の公開キー。 ノート: JWKFormatPublicKeyには、kid属性があります。 この属性は、JWKセットに適したJWKを選択するように設定されます。 この属性が定義されていない場合は、最初のJWKがJWTトークンの検証に使用されます。 |
|
この要素は、JWAをRS256に限定するようにJWTを制限する必要があります。 JWA=ES256でトークンが送信された場合、JWTは拒否されます。 この要素をRS256に設定します。 |
|
この要素は、デフォルトのスコープ・クレーム名を"スコープ"から顧客定義のスコープ・クレーム名に上書きするように定義されています。 |
|
デフォルトでは、JWTのスコープ値はスペース区切りです。 スコープ要求値はJSON構造としても提供できます。 この要素には2つの有効な値があります: |
以下に説明するように、注意すべき3つの追加機能があります。
-
HTTPSチャネルでJWA=NONEを許可
この機能により、JWTのシグネチャを検証せずにJWTをアサートできます。 中間者攻撃を防ぐために、JWTは安全なチャネルでのみ送信する必要があります。 JWTが安全なチャネルを介して送信されない場合、JWTは拒否されます。 JWT=Noneを許可するには、要素
PublicCertLocation
のuseFormat
属性をNONE
に設定する必要があります。<PublicCertLocation useFormat="NONE"> </PublicCertLocation>
-
JWAをRS256のみに制限
この機能は、JWAをRS256に限定するためにJWTを制限するために必要です。 JWA=ES256でトークンが送信された場合、JWTは拒否されます。 この機能を実装するには、OAuthプロファイルに次のXML要素を設定する必要があります。
<OutOfBandVerifyAlgorithm>RS256</OutOfBandVerifyAlgorithm>
- OAuthポリシー内では、JSON webトークンに存在するKID(キーID)に基づいてJSON webキーを選択できます。 何らかの理由でKIDがJSON webトークンに存在しない場合は、OAuthプロファイル自体の一部としてKIDを設定することができます。 この機能を使用して、JSONトークンの一部として提供されるKIDを上書きすることもできます。
サンプルOAuthプロファイル
このサンプルOAuthプロファイルXMLファイルを、ゲートウェイ・ノードにアップロードする前に、OAuth実装と一致するように編集します。
「Oracle API Platform Cloud Serviceのゲートウェイ・コントローラのREST API」のupdateoauthprofileアクションまたは「セキュリティ・プロファイルの更新」操作を参照してください。
<OAuth2TokenLocalEnforcerConfig> <Name>DEFAULT</Name> <HeaderNameIDToken>IDToken</HeaderNameIDToken> <Issuer>https://identity.oraclecloud.com/</Issuer> <AudienceRestrictionFromConfig>true</AudienceRestrictionFromConfig> <Audience>http://example:8001|OAuthTestApp</Audience> <MandatoryClaims></MandatoryClaims> <!-- useFormat has 2 values PEMFormatPubKey, X509FormatPubKey --> <PublicCertLocation useFormat='X509FormatPubKey'> <X509FormatPubKey>MIICUDCCAbmgAwIBAgIELfGcXDANBgkqhkiG9w0BAQUFADBXMRMwEQYKCZImiZPyLGQBGRYDY29tMRYwFAYKCZImiZPyLGQBGRYGb3JhY2xlMRUwEwYKCZImiZPyLGQBGRYFY2xvdWQxETAPBgNVBAMTCENsb3VkOUNBMB4XDTE1MTEyMDA5MzI0OFoXDTI1MTExNzA5MzI0OFowXzETMBEGCgmSJomT8ixkARkWA2NvbTEWMBQGCgmSJomT8ixkARkWBm9yYWNsZTEVMBMGCgmSJomT8ixkARkWBWNsb3VkMRkwFwYDVQQDDBBvcmNsTVQxMjMyMzJfaWRtMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCLVvyue+qFraxwM5LxaNLt2QH3wHn/n0+yk2jmP7mpYkz1xrKuEk2e2SCggzK8MT9jJ5VUaNlF0MwhIZ8/naxA5LPCzGEVfZ/41GPtGNADFyspqGHkdsNv+M2eCBme7MDp9L3noBtt2peqGqxSu0DHyt1wgNr6p6EXqTT4AbLdyQIDAQABoyEwHzAdBgNVHQ4EFgQU2rtogHKC0/ws2dS3Zq7s9wwMofkwDQYJKoZIhvcNAQEFBQADgYEAK1jtcbRpYFAl2Bp9X02MaA/igq3WXykizH7uQvrWgNQluf7ADbxaB7J96jaIN2GLQFxl6cbPwOvBIu7xd9a26eK6F5gq4iJKm7GeOgV5PZ4r5umvSZgA0aLOAbhZ/gwy40RauF0X+4I7JqamnV0DizM2YEDsFWKfTSvCy90ZizMwggJeMIIBx6ADAgECAgRgdcJQMA0GCSqGSIb3DQEBBQUAMFcxEzARBgoJkiaJk/IsZAEZFgNjb20xFjAUBgoJkiaJk/IsZAEZFgZvcmFjbGUxFTATBgoJkiaJk/IsZAEZFgVjbG91ZDERMA8GA1UEAxMIQ2xvdWQ5Q0EwIBcNMTUxMTE5MTIwMDQyWhgPMjExNTEwMjYxMTAwNDJaMFcxEzARBgoJkiaJk/IsZAEZFgNjb20xFjAUBgoJkiaJk/IsZAEZFgZvcmFjbGUxFTATBgoJkiaJk/IsZAEZFgVjbG91ZDERMA8GA1UEAxMIQ2xvdWQ5Q0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJeXcnReWfVIhqdedQKy+qi+tMp2NstgxHWisJ6OZf7O+KC9WzP+X+UwiQTMUzp+B4UWUEbpGNW7dv7jiyKdsgYGrnpwINl6OT4wrlKD8r2+7yQLNBsvDQjVeWmhHTqFfgqTfd/wi3MC2itft+I40O4GnSL3/VDcTSxJZMaigKizAgMBAAGjNTAzMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFPwqb7nQaKEVc+oSa7ohvOxIGMfXMA0GCSqGSIb3DQEBBQUAA4GBADydG93z/CGRVfUyVfD/ULT/d+RYfm3sriGgPPZlEO+idCgA6tEMcnIOFf3lP5CFAdFq6ykmFHMOf15CYvqkv7jZULiL3zMgy7OgB4I0i0WMUAAybqeiZlU90y86zd2yfAgQEM4ncUCHg+Dwf2XF0qmYK0XLF7CSb/hSEJJp4W2j</X509FormatPubKey> </PublicCertLocation> </OAuth2TokenLocalEnforcerConfig>