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へのアクセス

JCS - SaaS ExtensionOracle Application Builder Cloud Serviceなどの関連するOracle PaaSサービスからOracle Sales Cloud Webサービスにアクセスする場合、シングル・サインオンおよびアイデンティティ伝播が事前構成されます。次を参照してください。ただし、Oracle Cloud以外のプラットフォームを使用して、Oracle Sales Cloud APIにアクセスする拡張機能をホストする場合、Oracle Sales Cloudとの明示的な信頼およびアソシエーション関係を設定することが困難であるか時間がかかる可能性があります。Oracle Sales Cloudに組み込まれたOAuth機能には、より簡単なソリューションが用意されています。 アプリケーションでは、ユーザーの認証情報を渡し、Oracle Sales CloudからのOAuthトークンをリクエストしてから、トークンを使用してOracle Sales Cloud APIと対話できます。この例では、cURLコマンドを使用して手順を示します。これと同じロジックをアプリケーションに実装できます。

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交換には、次のステップが含まれます。

  1. クライアント・アサーションおよびユーザー・アサーションを取得します。

  2. クライアント・アサーションおよびユーザー・アサーションを使用してアクセス・トークンを取得します。

OAuthクライアントが登録されている必要があります。「Oracle Cloud Identity Managementの管理」「信頼されるOAuthクライアントの登録」を参照してください。

  1. 信頼されるクライアントの場合、「Oracle Cloud Identity Managementの管理」「鍵ペアからのOAuth資格証明のインポート」で説明しているように、クライアント証明書を生成およびアップロードする必要があります。署名アルゴリズムは、SHA-256ハッシュ・アルゴリズムを使用したRS256: RSASSA-PKCS-v1_5である必要があります。オプションで、keytoolコマンドを使用して秘密鍵と公開鍵のペアを生成することもできます。次に例を示します。
    keytool -genkeypair -keystore <mykeystore.jks> -alias <SalesCloudOAuthClient> -storepass <storepass password> -keypass <keypass password> -keyalg RSA -sigalg SHA1WithRSA -dname "CN=<User Name>, OU=<Sales Cloud>, O=<Oracle> L=<Anytown>, S=<CA>, C=<US>"

    注意:

    山括弧(<>)で囲まれた値は実際の入力値に置き換えてください。
    作成した別名はキーストアに追加されます。keytoolコマンドを使用してキーストアのコンテンツをリストすることにより、結果を検証できます。次に例を示します。
    keytool -list -v -keystore mykeystore.jks
    レスポンス出力で、keytoolコマンドの-aliasオプションで使用した名前を持つ別名を確認します。次に例を示します。
    Keystore type: JKS Keystore provider: SUN Your keystore contains 1 entry Alias name: salescloudoauthclient Creation date: Mar 24, 2017 Entry type: PrivateKeyEntry Certificate chain length: 1 ...
  2. LinuxまたはUNIX上のopensslコマンド・ライン・ツール、またはWindowsの「証明書のインポート」または「証明書のエクスポート」ウィザードを使用して、秘密鍵および対応する証明書を抽出します。「Oracle Cloud Identity Managementの管理」の 「opensslの使用による証明書の抽出」および 「「証明書のインポート」および「証明書のエクスポート」ウィザードの使用による証明書の抽出」を参照してください。
    また、keytoolコマンドを使用して証明書を抽出することもできます。次に例を示します。
    keytool -exportcert -alias salescloudoauthclient -keystore mykeystore.jks -file salescloudoauthclient.cer
  3. ここで、マイ・サービスのOAuth管理ページからこの証明書をOAuthクライアントに関連付けることができます。これは、信頼されるクライアントの場合は必須で、信頼できないクライアントの場合はオプションです。
    1. 「マイ・サービス」ページから、OAuth管理ページ、クライアントの登録セクションの順に移動します。
    2. 証明書を特定のクライアントに関連付けるには、そのクライアントの「アクション」メニューをクリックしてから、「証明書のインポート」を選択します。
    3. 証明書ファイルを選択するには、「参照」「インポート」の順にクリックします。
    成功メッセージが表示されます。
  4. クライアント・アサーションおよびユーザー・アサーションを使用してアクセス・トークンを取得します。アクセス・トークン・リクエストで使用するパラメータの完全な説明については、「Oracle Cloud Identity Managementの管理」「自己署名ユーザー・アサーションおよびクライアント・アサーションを使用したアクセス・トークンの取得」を参照してください。
    1. 署名ユーザー・アサーションを取得します。次に例を示します。
      public OAuthToken getUserAssertion(OAuthClientContext oAuthClientContext, String userId) throws GeneralSecurityException, IOException { Map<Object, Object> payloadMap = new HashMap<Object, Object>(10); payloadMap.put("iss", <of the oauth client> ); payloadMap.put("jti", UUID.randomUUID().toString()); payloadMap.put("prn", <valid sales cloud userid>); payloadMap.put("sub", <valid sales cloud userid>); payloadMap.put("exp", <OAuth Token expiry time>); payloadMap.put("iat", System.currentTimeMillis()); List l = new ArrayList(); l.add("oauth.idm.oracle.com"); payloadMap.put("aud", l); payloadMap.put("oracle.oauth.prn.id_type", "LDAP_UID"); payloadMap.put("oracle.oauth.sub.id_type", "LDAP_UID"); payloadMap.put("user.tenant.name", <ID Domain Name>); return signJWT(payloadMap); }

      注意:

      山括弧(<>)で囲まれた値は実際の入力値に置き換えてください。

      注意:

      デフォルトでは、OAuthトークンは60分後に有効期限が切れます。このステップ中、オプションで、expオプションを使用してユーザー・アサーションの有効期間を設定できます。これを行うと、システムによって返されるOAuthトークンは有効期間が同じになります。
    2. 署名クライアント・アサーションを取得します。次に例を示します。
      public OAuthToken getClientAssertion(OAuthClientContext oAuthClientContext) throws GeneralSecurityException, IOException { Map<Object, Object> payloadMap = new HashMap<Object, Object>(10); payloadMap.put("iss", <clientid of the OAuth client>); payloadMap.put("jti", UUID.randomUUID().toString()); payloadMap.put("prn", <clientid of the OAuth client>); payloadMap.put("sub", <clientid of the OAuth client>); payloadMap.put("exp", <OAuth Token expiry time>); payloadMap.put("iat", System.currentTimeMillis()); List l = new ArrayList(); l.add("oauth.idm.oracle.com"); payloadMap.put("aud", l); payloadMap.put("oracle.oauth.prn.id_type", "ClientID"); payloadMap.put("oracle.oauth.sub.id_type", "ClientID"); payloadMap.put("user.tenant.name", <ID Domain Name>); return signJWT(payloadMap); }
    3. クライアント証明書を使用してユーザー・アサーションおよびクライアント・アサーションを署名します。次に例を示します。
      public OAuthToken signJWT(Map<Object, Object> claimSet) throws GeneralSecurityException, UnsupportedEncodingException{ Map<Object, Object> headerMap = new HashMap<Object, Object>(); MessageDigest sha1 = MessageDigest.getInstance("SHA-1"); MessageDigest sha256 = MessageDigest.getInstance("SHA-256"); // Get the client certificate sha1.update(getClientCert().getEncoded()); byte[] sha1thumbPrint = sha1.digest(); byte[] sha256thumbPrint = sha256.digest(); headerMap.put("x5t", Base64.encodeBase64URLSafeString(sha1thumbPrint)); headerMap.put("x5t#S256", Base64.encodeBase64URLSafeString(sha256thumbPrint)); headerMap.put("typ", "JWT"); headerMap.put("alg", "RS256"); String headerAsString = JSONValue.toJSONString(headerMap); String encodedHeader = Base64.encodeBase64URLSafeString(headerAsString.getBytes("utf8")); String payloadAsString = JSONValue.toJSONString(claimSet); String encodedPayload = Base64.encodeBase64URLSafeString(payloadAsString.getBytes("utf8")); String toSign = encodedHeader + "."+ encodedPayload; byte[] inputBytes = toSign.getBytes("utf8"); Signature signature = Signature.getInstance("SHA256withRSA"); signature.initSign(privateKey); signature.update(inputBytes); byte[] signatureBytes = signature.sign(); String encodedSignature = Base64.encodeBase64URLSafeString(signatureBytes); return new OAuthToken(toSign + "."+ encodedSignature); } public X509Certificate getClientCert() { if(clientCert == null) { KeyStore keystore = null; X509Certificate cert = null; InputStream input = null; try { // Keystore type ex: jks keystore = KeyStore.getInstance(<keystoreType>); // Path where the keystore file is placed input = new FileInputStream(<keystoreFilePath>); // Keystore password given during key generation keystore.load(input, <keystorePassword>); // keyAlias is the name given for the key during key generation this.privateKey = (PrivateKey) keystore.getKey(<keyAlias>, <keyPassword>); if (certFile != null) { InputStream is = new FileInputStream(<certFile>); CertificateFactory x509CertFact = CertificateFactory.getInstance("X.509"); cert = (X509Certificate) x509CertFact.generateCertificate(is); } else { cert = (X509Certificate) keystore.getCertificate(<keyAlias>); } } catch (GeneralSecurityException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (input != null) { try { input.close(); } catch (IOException e) { e.printStackTrace(); } } } } return cert; }
      この場合、OAuthトークンは次のように定義されます。
      public class OAuthToken {     private String tokenValue;     public OAuthToken(String value) {         this.tokenValue = value;     }     public String getValue() {         return this.tokenValue;     } }
    4. 取得したクライアント・アサーションおよびユーザー・アサーションを渡してアクセス・トークンを取得します。次に例を示します。
      curl -i -H "Content-Type: application/x-www-form-urlencoded;charset=UTF-8" -H 'X-USER-IDENTITY-DOMAIN-NAME: <idm-domain>' --request POST https://<idm-domain>.identity.<data-center>.oraclecloud.com/oam/oauth2/tokens -d "grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer&assertion=<user assertion>&client_assertion=<client assertion>&scope=https%3A%2F%2F<sales cloud host>.crm.<data-center>.oraclecloud.com%2FsalesApi%2Fresources%2Flatest%2Fopportunities"

      注意:

      山括弧(<>)で囲まれた値は実際のアサーション値に置き換えてください。
  5. 取得したJWTトークンはデコードでき、アクセス・トークン内の要求を参照できます。https://jwt.io/を開き、「Debugger」にナビゲートし、上記のステップで取得したエンコードされたアクセス・トークンを貼り付けます。「Decoded」セクションでJWTトークンのサブジェクトおよびスコープを検証します。次に例を示します。
  6. このアクセス・トークンを使用して、Oracle Sales Cloud REST APIを起動します。商談のREST APIを起動して商談データをフェッチする例を次に示します。
    curl -X GET -H "Authorization: Bearer <token>" -H "Content-Type: application/json" -H "Cache-Control: no-cache" "https://<sales cloud host>.crm.<data-center>.oraclecloud.com/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"
    このリクエストのレスポンス例は、次のようになります。
    { "items": [ { "Name": "Opportunity C", "OptyId": 300000001703155, "Revenue": 20000, "WinProb": 90 }, { "Name": "Opportunity A", "OptyId": 300000001703089, "Revenue": 77000, "WinProb": 80 }, { "Name": "Opportunity B", "OptyId": 300000001703146, "Revenue": 27000, "WinProb": 50 }, { "Name": "Opp 1", "OptyId": 300000001703161, "Revenue": 0, "WinProb": 0 } ], "count": 4, "hasMore": false, "limit": 200, "offset": 0, "links": [ { "rel": "self", "href": "https://mysalescloud.crm.us2.oraclecloud.com:443/salesApi/resources/11.1.11/opportunities", "name": "opportunities", "kind": "collection" } ] }

信頼できないクライアントとOAuth

信頼できないクライアントは、クライアント資格証明を指定してから、返されたアサーションを使用してアクセス・トークンを取得することにより、Oracle Sales CloudとともにOAuthを使用できます。

このシナリオでは、アクセス・トークンは、クライアント資格証明およびパスワード資格証明を渡すことによって取得されます。「アイデンティティの概念の理解」「クライアント資格証明の付与」および「リソース所有者パスワード資格証明の付与」を参照してください。

高度なレベルでの信頼できないクライアントのOAuth交換には、次のステップが含まれます。

  1. クライアント資格証明およびパスワード資格証明を使用してクライアント・アサーションを取得します。

  2. クライアント・アサーションを使用してアクセス・トークンを取得します。

OAuthクライアントが登録されている必要があります。「Oracle Cloud Identity Managementの管理」「信頼できないOAuthクライアントの登録」を参照してください。

クライアント・アプリケーションのクライアントIDおよびクライアント・シークレットは、base64でエンコードされ、ヘッダーで送信されます。たとえば、認可ヘッダーには値base64encoded(client_id:client_secret)があります。この値は、クライアント・トークンを取得するために送信されます。次に例を示します。
b5617af3-3fe8-4736-a4ed-66cddda170b7:ZfgRLRMYfCftRmNCsnr8
信頼できないクライアントを使用してクライアント・アサーション、OAuthクライアント・アクセス・トークンの順に取得するには、次のステップを実行します。
  1. クライアント資格証明を提供してクライアント・アサーションを取得します。
    たとえば、次のcURLコマンドでは、クライアント資格証明を提供してクライアント・アサーションを取得します。付与タイプはclient_credentialsになっています。
    curl -i -H 'X-USER-IDENTITY-DOMAIN-NAME: <idm-domain>' -H "Authorization: Basic YjU2MTdhZjMtM2ZlOC00NzM2LWE0ZWQtNjZjZGRkYTE3MGI3OlpmZ1JMUk1ZZkNmdFJtTkNzbnI4" -H "Content-Type: application/x-www-form-urlencoded;charset=UTF-8" --request POST https://<idm-domain>.identity.<data-center>.oraclecloud.com/oam/oauth2/tokens -d 'grant_type=client_credentials'
    このコマンドにより、クライアント・アサーションが返されます。次に例を示します。
    eyJhbGciOiJSUzI1N...
  2. 前のステップのユーザー資格証明およびクライアント・アサーションを渡すことにより、アクセス・トークンを取得します。
    たとえば、cURLを使用します。
    curl -i -H 'X-USER-IDENTITY-DOMAIN-NAME: <idm-domain>' -H "Authorization: Basic YjU2MTdhZjMtM2ZlOC00NzM2LWE0ZWQtNjZjZGRkYTE3MGI3OlpmZ1JMUk1ZZkNmdFJtTkNzbnI4" -H 'Content-Type: application/x-www-form-urlencoded;charset=UTF-8' --request POST https://<idm-domain>.identity.<data-center>.oraclecloud.com/oam/oauth2/tokens -d 'grant_type=password&username=<user name>&password=<password>&client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion=<eyJhbGciOiJSUzI1N...>&scope=https://<sales cloud host>.crm.<data-center>.oraclecloud.com:443/'

    注意:

    括弧(<>)で囲まれた値は実際の入力値に置き換えてください。
    このコマンドにより、アクセス・トークンが返されます。次に例を示します。
    eyJhbGciOiJSU...
  3. このアクセス・トークンを使用して、Oracle Sales Cloud REST APIを起動します。
    たとえば、cURLを使用してサンプルのOracle Sales Cloudの商談REST APIにアクセスします。
    curl -X GET -H "Authorization: Bearer <eyJhbGciOiJSU...>" -H "Content-Type: application/json" -H "Cache-Control: no-cache" "https://<sales cloud host>.crm.<data-center>.oraclecloud.com/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"
    APIにより、ユーザー認証トークンが受け入れられ、リクエストしたデータが返されます。次に例を示します。
    { "status" : "{ "items" : [ { "Name" : "Opportunity C", "OptyId" : 300000001703155, "Revenue" : 20000, "WinProb" : 90 }, { "Name" : "Opportunity A", "OptyId" : 300000001703089, "Revenue" : 77000, "WinProb" : 80 }, { "Name" : "Opportunity B", "OptyId" : 300000001703146, "Revenue" : 27000, "WinProb" : 50 }, { "Name" : "Opp 1", "OptyId" : 300000001703161, "Revenue" : 0, "WinProb" : 0 } ], "count" : 4, "hasMore" : false, "limit" : 200, "offset" : 0, "links" : [ { "rel" : "self", "href" : "https://mysalescloud.crm.us2.oraclecloud.com:443/salesApi/resources/11.1.11/opportunities", "name" : "opportunities", "kind" : "collection" } ] }" }
同じトークンを有効期限が切れるまで使用してAPIコールを続けて作成できます。信頼できないクライアントの場合、OAuthトークンは常に、60分後に有効期限が切れます。異なる有効期間を設定できるのは、信頼されるクライアントを使用する場合のみです。

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; } }