REST 呼び出しおよび SOAP 呼び出しの認証

クラウド・ポータルは、REST API および SOAP API の呼び出しにおける基本認証の使用をサポートします。 ログイン資格情報をアプリケーションにハードコーディングする代わりに、別のファイルからそれらを取り込みます。

ログイン資格情報を使用するためには、それらを別個のファイルに保持して、認証中にアプリケーションから呼び出す方法が推奨されます。 この方法では、資格情報を変更するたびにアプリケーションのコードを変更する必要がありません。 主な代替方法としては、アプリケーションに直接、資格情報を追加する方法があります。 このアプローチでは、コードにミスが含まれてしまうリスクがあり、資格情報の更新のたびに、アプリケーションを再配布する必要が生じます。

クラウド・ポータルでは、2 つのタイプの資格情報が提供されます。

  • サービス資格情報: これらの資格情報では、クラウド・ポータルのパスワード更新ポリシーが免除されます。 これらは、REST API と SOAP API の呼び出しのみに有効です。 ユーザーは、それらを使用してポータルまたはそのコンポーネントにログインすることはできません。
    注: Operational Decision Manager on Cloud は SOAP 1.1をサポートします。 新しいバージョンの SOAP はサポートされません。
  • ローカル・アカウント: これらのユーザー・アカウントは、クラウド・ポータルのパスワード更新ポリシーが適用される資格情報を持っています。 ユーザーとアプリケーションは、これらの資格情報を使用してポータルとそのコンポーネントにログインできます。
ヒント:

アプリケーションの認証には、サービス資格情報を使用してください。 サービス資格情報は、セキュリティーが高度で、 ログイン資格情報の更新に独自のポリシーを適用することができます。

SAML ユーザー

SAML ログイン資格情報は、意思決定サービスへの認証には使用できません。 SAML を使用してクラウド・ポータルにログインする場合は、REST 呼び出しまたは SOAP 呼び出しのサービス資格情報を要求する必要があります。 IBM® の内部ユーザーは、自動的に SAML を使用してポータルにログインするため、サービス資格情報を要求する必要があります。

サービス資格情報の呼び出し

以下のステップでは、別個のファイルからサービス資格情報を呼び出すようにアプリケーションをセットアップする方法を示しています。 お客様の IT ストラテジーによっては、サービス資格情報の代わりに、ローカル・アカウントの資格情報を使用することもできます。

  1. クラウド管理者からサービス資格情報を入手します。 サービス資格情報を生成できるのは、クラウド管理者のみです。 サービス資格情報には、機能 ID とパスワードが含まれています。
  2. サービス資格情報をプロパティー・ファイル (sc.properties など) に配置します。
    odmoc.url=https://mytenant.bpm.ibmcloud.com/odm/dev
    odmoc.functionalId=api1.fid@t1023
    odmoc.password=xfmptNJsQONCvRXB1bYS1AxlIcYyh1UR2y/LMpyx

    この例のプロパティーは、次のように定義されています。

    プロパティー 説明
    odmoc.url クラウド・ポータルのテナントの URL
    odmoc.functionalId サービス資格情報の機能 ID
    odmoc.password サービス資格情報のパスワード
  3. アプリケーションで、ファイル sc.properties からサービス資格情報を呼び出すコードを追加します。 以下のコードは、Java™ クライアントからのものです。
    package test;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.util.Properties;
    
    import org.apache.commons.codec.binary.Base64;
    import org.apache.http.HttpResponse;
    import org.apache.http.Header;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.conn.ssl.NoopHostnameVerifier;
    import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
    import org.apache.http.impl.client.HttpClientBuilder;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.ssl.SSLContextBuilder;
    import org.apache.http.util.EntityUtils;
    
    import com.ibm.json.java.JSONObject;
    
    public class OdmRestClient {
        
        public static void main(String[] args) throws Exception {
    	// The builder should be configured to connect using HTTPS to ODM on Cloud,
    	// and must use a secure cipher with hostname verification. The following
    	// code does not reflect all the required settings.
            HttpClientBuilder builder = HttpClients.custom();
            builder.disableRedirectHandling();
            HttpClient client = builder.build();
    
            // This code calls the service credentials from the file sc.properties. 
            //It reads the url, functional Id and password from a property file.
            String configFile = "sc.properties";
            FileInputStream fistream = null;
            try {
                fistream = new FileInputStream(configFile);
            }
            catch (FileNotFoundException e) {
                System.out.println("Could not open file: " + configFile);
                System.exit(0);
            }
            Properties props = new Properties();
            props.load(fistream);
    
    	String baseurl = props.getProperty("odmoc.url");
            String fid = props.getProperty("odmoc.functionalId");
            String pwd = props.getProperty("odmoc.password");
    	String url = baseurl + "/res/api/v1/ruleapps?count=true";
    	
            // Basic Authentication header value
            String baHeader = fid + ":" + pwd;
    	System.out.println("BA header is: " + baHeader);
            baHeader = Base64.encodeBase64String(baHeader.getBytes());
            
            // execute request
            HttpResponse response = null;
    	System.out.println("** Calling: " + url);
    
            HttpGet request = new HttpGet(url);
            request.setHeader("Authorization", "Basic " + baHeader);                        
            try {
               response = client.execute(request);
            }
            catch (Exception e) {
               throw new Exception("Could not execute API call, reason: " + e.getMessage());
            }
            
            int httpRespCode = response.getStatusLine().getStatusCode();
    	System.out.println("Response code is: " + httpRespCode);
    
            if (httpRespCode==302) {
                // We are in one of these 3 cases: wrong ID, wrong password, account locked
                System.out.println("Basic auth access denied.");
    	    System.out.println("Reason1: Wrong ID or password");
    	    System.out.println("Reason2: Account locked after some unsuccessful attempts");
            }                        
            else if (httpRespCode==401) {
    	    // Aithorization is not granted to access the URL
                System.out.println("ODM API access was denied: you are not authorized");
            }
            else if (httpRespCode==200){                    
    	    // Correct execution result, extract the HTTP response
                String json = EntityUtils.toString(response.getEntity(), "UTF-8");
                System.out.println("Successful invocation, result : " + json);
            }
    	else {
    	    // Diagnose why such a code. Contact IBM support with all the details.
    	    System.out.println("Unexpected return code: " + httpRespCode);
    	}
        }
    }

HTTP クライアント・サイドは、認証中に以下のコードを戻す可能性があります。

コード 説明
Code 200 このコードは、正しい実行結果を示します。 戻される結果は、API 呼び出しに対する実際の応答です。 リダイレクト処理が無効化されていないと、資格情報が間違っているケースでコード 200 を受け取る可能性があります。 接続の問題を正確に診断するには、リダイレクト処理を無効化してください。
Code 302 機能 ID またはパスワードが間違っているとき、あるいはアカウントがロックされているときに、HTTP 要求はコード 302 を戻します。 認証失敗の原因は、このコードで示されません。 アカウントがロックされている場合は、アカウントが自動的にロック解除されるのを 1 時間待ってみることもできます。 アカウントが自動的にロック解除されない場合は、クラウド管理者に問い合わせてください。 このコードは、リダイレクト処理が無効化されているときに戻されます。
Code 401 資格情報は正しいが、当該 URL へのアクセスが許可されていないときに、このコードを受け取ります。 必要な許可の付与をクラウド管理者に依頼してください。 (注: このコードは現在戻されませんが、将来、許可が拡張される可能性があります。)
その他のコード その他のコードを受け取った場合は、 IBM に連絡して支援を受けてください ( トラブルシューティングとサポートを参照)。