REST 및 SOAP 호출의 인증

클라우드 포털은 REST및 SOAP API 호출에서 기본 인증 사용을 지원합니다. 로그인 인증 정보를 애플리케이션에 하드코딩하는 대신, 이를 별도의 파일로부터 가져오십시오.

로그인 인증 정보의 사용에 대해 권장되는 방식은 이를 별도의 파일에 두고 인증 중에 애플리케이션에서 호출하는 것입니다. 이 접근법을 사용하면 인증 정보를 변경할 때마다 애플리케이션의 코드를 변경할 필요가 없습니다. 기본적인 대안은 애플리케이션에 인증 정보를 직접 추가하는 것입니다. 이 접근법은 코드에서 오류가 생길 가능성을 발생시키며, 인증 정보를 업데이트할 때마다 애플리케이션을 재배치해야 합니다.

클라우드 포털은 두 가지 유형의 신임 정보를 제공합니다.

  • 서비스 인증 정보: 이러한 인증 정보에는 클라우드 포털의 비밀번호 갱신 정책이 면제됩니다. 이들 정보는 REST 및 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 HTTP 요청은 기능 ID 또는 비밀번호가 잘못되었거나 계정이 잠겨 있는 경우 코드 302를 리턴합니다. 이 코드는 인증 실패의 원인을 제공하지 않습니다. 계정이 잠긴 경우에는 계정이 자동으로 잠금 해제되도록 한 시간을 기다릴 수 있습니다. 계정이 자동으로 잠금 해제되지 않는 경우에는 클라우드 관리자에게 문의하십시오. 이 코드는 경로 재지정 처리가 비활성화된 경우 리턴됩니다.
Code 401 인증 정보가 올바르지만 URL에 액세스할 수 있도록 권한 부여되지 않은 경우에는 이 코드를 수신합니다. 필요한 권한을 부여하도록 클라우드 관리자에게 문의해야 합니다. (참고: 이 코드는 현재 리턴되지 않으나, 향후에는 권한 부여가 강화될 수 있습니다.)
기타 코드 다른 코드가 있는 경우 IBM 에 문의하여 도움을 받으십시오 ( 문제점 해결 및 지원참조).