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 ストラテジーによっては、サービス資格情報の代わりに、ローカル・アカウントの資格情報を使用することもできます。
- クラウド管理者からサービス資格情報を入手します。 サービス資格情報を生成できるのは、クラウド管理者のみです。 サービス資格情報には、機能 ID とパスワードが含まれています。
- サービス資格情報をプロパティー・ファイル (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サービス資格情報のパスワード - アプリケーションで、ファイル 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 に連絡して支援を受けてください ( トラブルシューティングとサポートを参照)。 |