Autenticación para invocar las API REST y SOAP
El método recomendado para utilizar credenciales de inicio de sesión es mantenerlas en un archivo separado e invocarlas desde la aplicación del usuario durante la autenticación. De esta manera no es necesario alterar el código de la aplicación cada vez que el usuario cambia sus credenciales. La alternativa principal es añadir las credenciales directamente a la aplicación. Este método corre el riesgo de producir errores en el código y hace que el usuario tenga que volver a desplegar la aplicación cada vez que actualiza las credenciales.
El portal de Cloud ofrece dos tipos de credenciales:
- Credenciales de servicio: estas credenciales están exentas de las políticas de renovación de contraseñas del portal de Cloud. Solamente son válidas para llamar a las API REST y SOAP. Los usuarios no pueden utilizarlos para iniciar sesión en el portal o sus componentes.Nota: Operational Decision Manager on Cloud da soporte a SOAP 1.1. No da soporte a versiones posteriores de SOAP.
- Cuentas locales: estas cuentas de usuario tienen credenciales que están sujetas a las políticas de renovación de contraseñas del portal de Cloud. Los usuarios y las aplicaciones pueden utilizar estas credenciales para iniciar sesión en el portal y sus componentes.
Utilice credenciales de servicio para autenticar aplicaciones. Las credenciales de servicio proporcionan una mejor seguridad, y el usuario puede aplicar sus propias políticas para actualizar las credenciales de inicio de sesión.
Usuarios de SAML
No puede utilizar credenciales de inicio de sesión de SAML para autenticar un servicio de decisiones. Si utiliza SAML para iniciar sesión en el portal de nube, debe solicitar credenciales de servicio para la invocación de REST o SOAP. Los usuarios internos de IBM® utilizan automáticamente SAML para iniciar sesión en el portal y deben solicitar credenciales de servicio.
Llamada a credenciales de servicio
Los pasos siguientes describen cómo configurar una aplicación para llamar a credenciales de servicio contenidas en un archivo separado. Dependiendo de la estrategia de TI, puede utilizar las credenciales de una cuenta local en lugar de las credenciales de servicio.
- Consulte al administrador de Cloud para obtener las credenciales de servicio. Solamente un administrador de Cloud puede crear credenciales de servicio. Las credenciales de servicio incluyen un ID funcional y una contraseña.
- Coloque las credenciales de servicio en un archivo de propiedades, por ejemplo, sc.properties:
odmoc.url=https://mytenant.bpm.ibmcloud.com/odm/dev odmoc.functionalId=api1.fid@t1023 odmoc.password=xfmptNJsQONCvRXB1bYS1AxlIcYyh1UR2y/LMpyxLas propiedades de este ejemplo se definen de la siguiente manera:
Propiedad Descripción odmoc.urlURL del arrendatario del portal de Cloud odmoc.functionalIdEl ID funcional en las credenciales de servicio odmoc.passwordLa contraseña en las credenciales de servicio - En la aplicación, añada el código que llama a las credenciales de servicio desde el archivo sc.properties. El código siguiente es de un 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); } } }
El cliente HTTP puede devolver los códigos siguientes durante la autenticación:
| Código | Descripción |
|---|---|
Code 200 |
Este código denota un resultado de ejecución correcta. El resultado devuelto es la respuesta a la llamada de API. Puede obtener el Código 200 en el caso de credenciales incorrectas cuando la gestión del redireccionamiento no está desactivado. Para diagnosticar un problema de conexión con exactitud, desactive la gestión del redireccionamiento. |
Code 302 |
La solicitud HTTP devuelve el Código 302 cuando el ID funcional o la contraseña son incorrectos, o cuando la cuenta está bloqueada. El código no proporciona la causa del error de autenticación. Si la cuenta está bloqueada, puede esperar una hora para que la cuenta se desbloquee automáticamente. Si la cuenta no se desbloquea automáticamente, consulte al administrador de Cloud. Este código se devuelve cuando la gestión del redireccionamiento está desactivado. |
Code 401 |
Recibe este código cuando las credenciales son correctas, pero no tienen autorización para acceder al URL. Debe solicitar al administrador de Cloud que otorgue la autorización necesaria. (Nota: actualmente no se devuelve este código, pero la autorización se podría mejorar en el futuro.) |
| Otros códigos | Si obtiene algún otro código, póngase en contacto con IBM para obtener ayuda (consulte Resolución de problemas y soporte). |