66 OAuthを使用したOracle Cloud PaaS-SaaSアプリケーションの保護
Oracle PaaSを使用してOracle SaaSを拡張する場合にユーザー・アイデンティティを保護する最善のアプローチの1つは、OAuth 2.0を対象として組み込まれたサポートを活用する方法です。
OAuth 2.0は、パスワードが漏えいするリスクを負わずに複数のシステムおよびドメインにわたってユーザーのアイデンティティを検証するためのオープン・スタンダードのトークン交換テクノロジです。Oracle PaaSには、Oracle Cloud FusionアプリケーションであるOracle Sales Cloud、Oracle HCM CloudおよびOracle ERP Cloudを含む複数のOracle SaaSサービス・オファリングの場合と同様、OAuth 2.0を対象としたサポートが組み込まれています。また、Cloud Fusionアプリケーションとサード・パーティ(Oracle以外)のWebアプリケーションおよびサービスの間でOAuthを使用することもできます。
JCS - SaaS Extensionアプリケーションを使用したOAuth実装の一部として、JCS - SaaS Extension CSFストアに資格証明を格納すると役に立つ場合があります。「JCS - SaaS Extension CSFストアでの資格証明の安全な格納およびフェッチ」を参照してください。
サード・パーティのアプリケーション(Oracle Cloud PaaSでホストされていないアプリケーション)では、Oracle Sales Cloud APIに対するコールを行うためにOAuthを使用できます。これらのステップについては、「Oracle Cloud Identity Managementの管理」の「自己署名ユーザー・アサーションおよびクライアント・アサーションを使用したアクセス・トークンの取得」で説明されています。
Oracle PaaSを使用してOracle SaaS拡張機能を作成する場合、ロール・ベースの認可戦略について検討してください。「JCS - SaaS ExtensionとOracle SaaSの相互作用の認可戦略」を参照してください。
Oracle CPQ Cloudには、OAuthトークンを生成するために特別な機能が組み込まれています。「OAuthサーバーとして機能するCPQ Cloudの構成」を参照してください。
OAuthを使用したOracle Sales Cloud REST APIへのアクセス
OAuthトークンの有効期限について
デフォルトでは、Oracle Cloudによって発行されるOAuthトークンは60分後に有効期限が切れます。信頼されるクライアントは、「前提条件および制限」で説明しているように、ユーザー・アサーション・フローを使用して、指定したユーザー・アサーション有効期限と一致する有効期間を持つトークンをリクエストできます。
前提条件および制限
Oracle Sales Cloudを使用したOAuthには、次の要件および制限があります。
-
「マイ・サービス」で、「ユーザー」、OAuth管理の順にナビゲートします。FAクラウド・サービス(Oracle Sales Cloud、 Oracle HCM CloudまたはOracle ERP Cloud)のリソースおよびクライアントがOAuth管理ビューに表示されない場合、OAuthサポート用の環境を作成するサービス・リクエストを発行する必要があります。詳細は、Oracleサポートに連絡してください。
-
アイデンティティ伝播が機能するには、両方のフェデレーテッド環境内にユーザー・アイデンティティが存在する必要があります。FA SaaSのユーザーおよびロールは、SIMベースのPaaSサービスと同期しています。「Oracle Sales Cloud、Oracle HCM CloudおよびOracle ERP Cloudユーザー・アイデンティティおよびロールとSIMの同期」を参照してください。
-
サポートされているOAuthのタイプをレビューするには、「アイデンティティの概念の理解」の「Oracle Cloud内のOAuthの概要」を参照してください。
-
現在のOracle Cloud SIM OAuth実装は、リフレッシュ・トークンをサポートしていません。
信頼されるクライアントとOAuth
信頼されるクライアントは、OAuthトークンを取得し、これを使用してOracle Sales Cloud REST APIを起動することにより、Oracle Sales CloudとともにOAuthを使用できます。
このシナリオでは、アクセス・トークンは、クライアント・アサーションおよびユーザー・アサーションを渡すことによって取得されます。「アイデンティティの概念の理解」の「クライアント・アサーション」および「ユーザー・アサーションの付与」を参照してください。
高度なレベルでの信頼されるクライアントのOAuth交換には、次のステップが含まれます。
-
クライアント・アサーションおよびユーザー・アサーションを取得します。
-
クライアント・アサーションおよびユーザー・アサーションを使用してアクセス・トークンを取得します。
OAuthクライアントが登録されている必要があります。「Oracle Cloud Identity Managementの管理」の「信頼されるOAuthクライアントの登録」を参照してください。
信頼できないクライアントとOAuth
信頼できないクライアントは、クライアント資格証明を指定してから、返されたアサーションを使用してアクセス・トークンを取得することにより、Oracle Sales CloudとともにOAuthを使用できます。
このシナリオでは、アクセス・トークンは、クライアント資格証明およびパスワード資格証明を渡すことによって取得されます。「アイデンティティの概念の理解」の「クライアント資格証明の付与」および「リソース所有者パスワード資格証明の付与」を参照してください。
高度なレベルでの信頼できないクライアントのOAuth交換には、次のステップが含まれます。
-
クライアント資格証明およびパスワード資格証明を使用してクライアント・アサーションを取得します。
-
クライアント・アサーションを使用してアクセス・トークンを取得します。
OAuthクライアントが登録されている必要があります。「Oracle Cloud Identity Managementの管理」の「信頼できないOAuthクライアントの登録」を参照してください。
クライアント・アプリケーションのクライアントIDおよびクライアント・シークレットは、base64でエンコードされ、ヘッダーで送信されます。たとえば、認可ヘッダーには値base64encoded(client_id:client_secret)
があります。この値は、クライアント・トークンを取得するために送信されます。次に例を示します。b5617af3-3fe8-4736-a4ed-66cddda170b7:ZfgRLRMYfCftRmNCsnr8信頼できないクライアントを使用してクライアント・アサーション、OAuthクライアント・アクセス・トークンの順に取得するには、次のステップを実行します。
OWSMポリシーを使用したOAuth REST APIコールの使用
OWSMで使用可能なOAuthトークンベースのポリシーを使用してOracle Sales Cloud REST APIへのコールを保護できます。
JCS - SaaS Extensionには、REST APIコールを作成する場合に便利な組込みポリシーが含まれるOWSMサーバーが用意されています。デフォルトのグローバル・ポリシー・アタッチメント(GPA)を使用することも、クライアント上のアタッチメントを使用してポリシーを構成することもできます。
「Webサービスの保護」には、ポリシーを使用してWebサービスを保護する方法が詳しく説明されています。次の例では、OAuthの使用方法を説明するために簡単なコード・スニペットを示します。
JCS - SaaS Extension GPAの使用
oracle/http_oauth2_token_over_ssl_client_policy
ポリシーは、JCS - SaaS Extension上でGPAとして構成されます。クライアント側でOWSMポリシーが構成されていない場合、JCS - SaaS Extension GPAが使用されます。次のコード・スニペットは、Oracle Sales Cloud REST APIをコールするOWSMポリシー構成のないRESTクライアントを示しています。
注意:
山括弧(<>)で囲まれた値は実際の入力値に置き換えてください。public class SalesRESTClient { public SalesRESTClient(){ } public static String oppRestCall() { String resString = ""; try { SSLContext sslContext = null; sslContext = SSLContext.getDefault(); ClientConfig cfg = new DefaultClientConfig(); cfg.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); cfg.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, new HTTPSProperties(null, sslContext)); Client cli = Client.create(cfg); ClientFilter filter = new RESTClientFilter(); cli.addFilter(filter); cli.addFilter(new LoggingFilter(System.out)); String url = "https://<SALES_CLOUD_HOST>/salesApi/resources/latest/opportunities?limit=200&finder=MyOpportunitiesFinder;EffectiveBeginDate=2017-01-01,EffectiveEndDate=2017-03-31,RecordSet=ALLOPTIES&onlyData=true&fields=OptyId,Name,Revenue,WinProb"; WebResource webResource = cli.resource(url); ClientResponse cliResp = webResource.accept(MediaType.APPLICATION_JSON_TYPE).get(ClientResponse.class); resString = cliResp.getEntity(String.class); } catch (NoSuchAlgorithmException nsaE) { nsaE.printStackTrace(); } catch(Exception e){ e.printStackTrace(); } return resString; } }
クライアント・ポリシーの使用
次のOAuth 2.0クライアント・ポリシーを使用してOracle Sales Cloudに対するOAuthベースのREST APIコールを作成するようアプリケーションを構成できます。
-
oracle/http_oauth2_token_client_policy
-
oracle/http_oauth2_token_over_ssl_client_policy
-
oracle/http_oauth2_token_opc_oauth2_client_policy
-
oracle/http_oauth2_token_opc_oauth2_over_ssl_client_policy
次のコード・スニペットは、ポリシーを使用してSales Cloud REST APIをコールする方法を示しています。この例では、oracle/http_oauth2_token_client_policy
が使用されていますが、任意のOAuthポリシーを使用するようコードを変更できます。
注意:
山括弧(<>)で囲まれた値は実際の入力値に置き換えてください。public class SalesRESTClient { public SalesRESTClient(){ } public static String oppRestCall() { System.out.println("Preparing REST call"); String resString = ""; try { SSLContext sslContext = null; sslContext = SSLContext.getDefault(); ClientConfig cfg = new DefaultClientConfig(); cfg.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); cfg.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, new HTTPSProperties(null, sslContext)); // Configure the token server url PropertyFeature oAuthConfigPropFeature = new PropertyFeature("token.uri","<TOKEN_SERVER_URL>"); PropertyFeature[] oAuthClientPropFeatures = new PropertyFeature[1]; // The client_id and secret of the OAuth client(JCS-SX in this case) is stored in a a csf map.// Here it is named as "jcs-sales-cloud-oauth.csf.key" which contains the client_id,secret of the // registered JCS-SX OAuth client.This key is added to "oracle.wsm.security map" in respective // JCS-SX using java cloud sdk as follows: // java -jar javacloud.jar -user <user> -password <password> -identitydomain <iddomain> - // serviceinstance <serviceinstance> -datacenter <datacenter> -set-credential -map // oracle.wsm.security -// key jcs-sales-cloud-oauth.csf.key -keyuser <clientid> -keypassword // <secret> oAuthClientPropFeatures[0] = new PropertyFeature("oauth2.client.csf.key", "jcs-sales-cloud- oauth.csf.key"); PolicyReferenceFeature[] policyFeatures = new PolicyReferenceFeature[2]; policyFeatures[0] = new PolicyReferenceFeature("oracle/oauth2_config_client_policy", oAuthConfigPropFeature); policyFeatures[1] = new PolicyReferenceFeature("oracle/http_oauth2_token_client_policy", oAuthClientPropFeatures); cfg.getProperties().put(AbstractPolicyFeature.ABSTRACT_POLICY_FEATURE, new PolicySetFeature(policyFeatures)); Client cli = Client.create(cfg); ClientFilter filter = new RESTClientFilter(); cli.addFilter(filter); cli.addFilter(new LoggingFilter(System.out)); // Example Sales Cloud REST URL String url = "https://<SALES_CLOUD_HOST>/salesApi/resources/latest/opportunities?limit=200&finder=MyOpportunitiesFinder;EffectiveBeginDate=2017-01-01,EffectiveEndDate=2017-03-31,RecordSet=ALLOPTIES&onlyData=true&fields=OptyId,Name,Revenue,WinProb"; WebResource webResource = cli.resource(url); ClientResponse cliResp = webResource.accept(MediaType.APPLICATION_JSON_TYPE).get(ClientResponse.class); resString = cliResp.getEntity(String.class); } catch (NoSuchAlgorithmException nsaE) { nsaE.printStackTrace(); } catch(Exception e){ e.printStackTrace(); } return resString; } }