Autenticação para Chamada REST e SOAP

O portal em nuvem suporta o uso da autenticação básica na chamada de APIs REST e SOAP Em vez de codificar permanentemente credenciais de login em seu aplicativo, extraia-as de um arquivo separado.

A prática recomendada para o uso de credenciais de login é mantê-las em um arquivo separado, e chamá-las de sua aplicação durante a autenticação. Com essa abordagem, você não tem que alterar o código de sua aplicação toda vez que alterar suas credenciais. A alternativa primária é adicionar as credenciais diretamente ao seu aplicativo. Esta abordagem arrisque a introdução de erros ao seu código, e requer que você reimplemente o aplicativo toda vez que atualizar as credenciais.

O portal da nuvem oferece dois tipos de credenciais:

  • Credenciais de serviço: Estas credenciais estão isentas das polias de renovação de senha do portal da nuvem. Eles são válidos apenas para chamar APIs REST e SOAP. Os usuários não podem utilizá-los para fazer login no portal ou em seus componentes.
    Nota: Operational Decision Manager on Cloud suporta SOAP 1.1. Ele não suporta versões posteriores de SOAP..
  • Contas locais: essas contas de usuários possuem credenciais que estão sujeitas às políticas de renovação de senha do portal da nuvem. Usuários e aplicativos podem usar essas credenciais para fazer login no portal e em seus componentes.
Dica:

Use credenciais de serviço para autenticar suas aplicações. Eles fornecem melhor segurança, e você pode aplicar suas próprias políticas para atualização de credenciais de login.

Usuários do SAML

Não é possível utilizar credenciais de login do SAML para autenticar um serviço de decisão. Se você usar o SAML para fazer login no portal da nuvem, você deve solicitar credenciais de serviço para chamada REST ou SOAP. Os usuários internos do IBM® automaticamente utilizam o SAML para efetuar login no portal e devem solicitar credenciais de serviço.

Chamando credenciais de serviço

As etapas a seguir mostram como configurar o seu aplicativo para chamar credenciais de serviço a partir de um arquivo separado. Dependendo da sua estratégia de TI, você pode usar as credenciais de uma conta local no lugar das credenciais de serviço.

  1. Obtenha suas credenciais de serviço a partir de seu administrador de cloud. Apenas um administrador de nuvem pode gerar credenciais de serviço. As credenciais de serviço incluem um ID funcional e uma senha.
  2. Coloque as credenciais de serviço em um arquivo de propriedade, por exemplo, sc.properties:
    odmoc.url=https://mytenant.bpm.ibmcloud.com/odm/dev
    odmoc.functionalId=api1.fid@t1023
    odmoc.password=xfmptNJsQONCvRXB1bYS1AxlIcYyh1UR2y/LMpyx

    As propriedades neste exemplo são definidas da seguinte forma:

    Propriedade Descrição
    odmoc.url A URL do seu locatário do portal da nuvem
    odmoc.functionalId O ID funcional nas credenciais de serviço
    odmoc.password A senha nas credenciais de serviço
  3. Em seu aplicativo, inclua o código que chama as credenciais de serviço do arquivo sc.properties. O código a seguir é de um cliente 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);
    	}
        }
    }

O lado do cliente HTTP pode retornar os seguintes códigos durante a autenticação:

Código Descrição
Code 200 Este código denota um resultado de execução correto. O resultado do retorno é a resposta real para a chamada API. Você pode obter o Código 200 no caso de credenciais erradas quando a manipulação de redirecionamento não for desativada. Para diagnosticar um problema de conexão com precisão, desative o manuseio de redirecionamento.
Code 302 A solicitação HTTP retorna o código 302 quando a ID funcional ou a senha está incorreta ou a conta está bloqueada. O código não fornece a causa da falha de autenticação. Se a conta estiver bloqueada, você pode tentar esperar uma hora para que a conta seja desbloqueada automaticamente. Se a conta não for desbloqueada automaticamente, entre em contato com o administrador da nuvem. Este código é retornado quando a manipulação de redirecionamento é desativada
Code 401 Você recebe esse código quando as credenciais estão corretas, mas não estão autorizadas a acessar o URL. Você deve pedir ao seu administrador de cloud para conceder a autorização necessária. (Nota: Este código não é retornado atualmente mas a autorização poderia ser aprimorada no futuro.)
Outros códigos Se você obter qualquer outro código, entre em contato IBM para assistência (consulte Resolução de Problemas e Suporte).