Autenticazione per richiamo REST e SOAP

Il portale cloud supporta l'utilizzo dell'autenticazione di base nel richiamo delle API REST e SOAP. Invece di codificare le credenziali di accesso nella propria applicazione, estrarle da un file separato.

La procedura consigliata per l'utilizzo delle credenziali di login è quella di conservarle in un file separato e di richiamarle dalla tua applicazione durante l'autenticazione. Con questo approccio, non devi modificare il codice della tua applicazione ogni volta che modifichi le tue credenziali. L'alternativa principale è aggiungere le credenziali direttamente alla tua applicazione. Questo approccio rischia l'introduzione di errori nel codice e richiede di ridistribuire l'applicazione ogni volta che si aggiornano le credenziali.

Il portale cloud offre due tipologie di credenziali:

  • Credenziali del servizio: queste credenziali sono esenti dalle politiche di rinnovo password del portale cloud. Sono validi solo per richiamare le API REST e SOAP. Gli utenti non possono utilizzarli per accedere al portale o ai suoi componenti (vedi Credenziali del servizio per l'applicazione client).
    Nota: Operational Decision Manager on Cloud supporta SOAP 1.1. Non supporta versioni successive di SOAP.
  • Account locali: questi account utente dispongono di credenziali soggette alle politiche di rinnovo della password del portale cloud. Gli utenti e le applicazioni possono utilizzare queste credenziali per accedere al portale e ai suoi componenti.
Suggerimento:

Utilizza credenziali del servizio per autenticare le tue applicazioni. Forniscono una maggiore sicurezza e puoi applicare le tue proprie politiche per aggiornare le credenziali di login.

Utenti SAML

Non è possibile utilizzare le credenziali di accesso SAML per autenticare un servizio di decisione. Se utilizzi SAML per accedere al portale cloud, devi richiedere le credenziali del servizio per il richiamo REST o SOAP (vedi Acquisizione di una serie di credenziali del servizio). Gli utenti interni IBM® utilizzano automaticamente SAML per accedere al portale e devono richiedere le credenziali del servizio.

Richiamo delle credenziali del servizio

La seguente procedura ti mostra come configurare la tua applicazione per richiamare le credenziali del servizio da un file separato. A seconda della tua strategia IT, puoi usare le credenziali di un account locale al posto delle credenziali del servizio.

  1. Ottenere le credenziali del servizio dall'amministratore del cloud. Solo un amministratore cloud può generare credenziali del servizio. Le credenziali del servizio comprendono un ID funzionale e una password.
  2. Inserisci le credenziali del servizio in un file delle proprietà, ad esempio sc.properties:
    odmoc.url=https://mytenant.bpm.ibmcloud.com/odm/dev
    odmoc.functionalId=api1.fid@t1023
    odmoc.password=xfmptNJsQONCvRXB1bYS1AxlIcYyh1UR2y/LMpyx

    Le proprietà in questo esempio sono definite come segue:

    Proprietà Descrizione
    odmoc.url L' URL del proprio tenant del portale cloud
    odmoc.functionalId L'ID funzionale nelle credenziali del servizio
    odmoc.password La password nelle credenziali del servizio
  3. Nella tua applicazione, aggiungi il codice che richiama le credenziali del servizio dal file sc.properties. Il seguente codice proviene da un client 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);
    	}
        }
    }

Il lato client HTTP può restituire i seguenti codici durante l'autenticazione:

Codice Descrizione
Code 200 Questo codice indica un risultato di esecuzione corretto. Il risultato della restituzione è la risposta effettiva alla chiamata API. È possibile ottenere il codice 200 in caso di credenziali errate quando la gestione del reindirizzamento non è disattivata. Per diagnosticare accuratamente un problema di connessione, disattivare la gestione del reindirizzamento.
Code 302 La richiesta HTTP restituisce il codice 302 quando l'ID funzionale o la password sono errati o l'account è bloccato. Il codice non fornisce la causa dell'errore di autenticazione. Se l'account è bloccato, è possibile provare ad attendere un'ora prima che l'account venga sbloccato automaticamente. Se l'account non viene sbloccato automaticamente, contattare l'amministratore cloud. Questo codice viene restituito quando la gestione del reindirizzamento è disattivata
Code 401 Si ottiene questo codice quando le credenziali sono corrette, ma non sono autorizzate ad accedere all' URL. È necessario chiedere all'amministratore cloud di concedere l'autorizzazione richiesta. (Nota: questo codice non viene attualmente restituito, ma l'autorizzazione potrebbe essere migliorata in futuro.)
Altri codici Se si riceve un altro codice, contattare IBM per assistenza (consultare Risoluzione dei problemi e supporto).