viernes, 22 de enero de 2016

WSO2 Data Service Server NPE con REST y JSON.

image

Haciendo algunas pruebas para un servicio de datos a manera de demo, estuvimos revisando sus facilidades para exponer funcionalidades de manera RESTful. Una vez configurada una operación de insersión que recibía varios datos y enviar el JSON que imaginamos debía enviarse nos topamos con un error NPE.

Probamos con POX desde el RESTClient en firefox y sin problema.

image

Pero con JSON, convirtiendo el XML a JSON usando http://codebeautify.org/xmltojson no funcionaba.
image


En la consola se muestra el siguiente error:
image


Hicimos el cambio que pedía en el JSON:
image

Y sin problema. Faltaba incluirle al inicio del elemento raiz el string   _post.

lunes, 11 de enero de 2016

WSO2 DAS: fallo de autenticación en admin-dashboard

image

He estado trabajando en un escenario de integración que incluye las siguientes herramientas:
  • WSO2 Identity Server 5.0.0 como key manager y gestión de usuarios.
  • WSO2 API Manager 1.9.1 para la gestión de las APIs.

La integración se hace bastante rápida y existe un manual bien detallado al respecto en la documentación oficial.

Para ver el uso de las APIs quise integrar además el WSO2 Dashboard Application Server 3.0.0 a esta fiesta de herramientas así que me fui al manual del WSO2 API Manager y seguí los pasos descritos.

Al intentar acceder al Admin Dashboard con las credenciales por defecto admin/admin me topo que no me permite autenticarme. Pruebo autenticarme en el WSO2 IS y funciona, en el DAS también funciona, en el Publisher y en el Store pues también funciona, así que ya es algo extraño.

Activo el modo debug y a bucear en los logs y esto es lo que me encuentro.

Invocación del WSO2 DAS al WSO2 IS para autenticar al usuario vía servicios web:
Request:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
               xmlns:aut="http://authentication.services.core.carbon.wso2.org">
    <soap:Header/>
    <soap:Body>
        <aut:login>
            <aut:username>admin</aut:username>
            <aut:password>admin</aut:password>
            <aut:remoteAddress>localhost</aut:remoteAddress>
        </aut:login>
    </soap:Body>
</soap:Envelope>
Response:
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
    <soapenv:Body>
        <ns:loginResponse xmlns:ns="http://authentication.services.core.carbon.wso2.org">
            <ns:return>true</ns:return>
        </ns:loginResponse>
    </soapenv:Body>
</soapenv:Envelope>


Invocación para obtener el listado de roles del usuario y validar si se le permite el acceso:
Request:
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
    <soapenv:Body>
        <ser:getRoleListOfUser xmlns:ser="http://service.ws.um.carbon.wso2.org">
            <ser:userName>admin</ser:userName>
        </ser:getRoleListOfUser>
    </soapenv:Body>
</soapenv:Envelope>
Response:
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
    <soapenv:Body>
        <ns:getRoleListOfUserResponse xmlns:ns="http://service.ws.um.carbon.wso2.org"
                >
            <ns:return>Internal/admin</ns:return>
            <ns:return>Internal/subscriber</ns:return>
            <ns:return>Internal/WSO2.ORG_admin_DefaultApplication_PRODUCTION</ns:return>
            <ns:return>Internal/WSO2.ORG_admin_DefaultApplication_SANDBOX</ns:return>
            <ns:return>Internal/everyone</ns:return>
        </ns:getRoleListOfUserResponse>
    </soapenv:Body>
</soapenv:Envelope>

Como pueden apreciar el listado de roles que se devuelve es el siguiente:
  • Internal/admin
  • Internal/subscriber
  • Internal/WSO2.ORG_admin_DefaultApplication_PRODUCTION
  • Internal/WSO2.ORG_admin_DefaultApplication_SANDBOX
  • Internal/everyone

Cuando  reviso el fichero donde se definen los roles con permito a admin-dashboard, el fichero site.json  aparece lo siguiente:
Roles permitidos:
  • admin
  • subscriber
{
    "theme" : {
        "base" : "default",
        "subtheme" : "modern"
    },
    "context" : "/admin-dashboard",
    "request_url":"READ_FROM_REQUEST",
    "tasksPerPage": 10,
    "allowedRole":"admin",
    "allowedRoles":"admin,subscriber",
    "workflows":{
     "applicationWorkFlowServerURL": "https://localhost:9446/services/",
     "subscriptionWorkFlowServerURL": "https://localhost:9446/services/",
     "signupWorkFlowServerURL": "https://localhost:9446/services/",
     "appRegistrationWorkFlowServerURL": "https://localhost:9446/services/"

    },
    "ssoConfiguration" : {
        "enabled" : "false",
        "issuer" : "API_WORKFLOW_ADMIN",
        "identityProviderURL" : "https://localhost:9448/samlsso",
        "keyStorePassword" : "",
        "identityAlias" : "",
        "responseSigningEnabled":"true",
        "keyStoreName" :""
    }
}
Tuve que adicionar el rol Internal/admin  al listado de allowedRoles para que mediera acceso a la aplicación.

De esa manera ya tuve acceso y pude terminar la integración con el DAS. En próximas entradas estaré posteando la integración entre estas 3 herramientas.

Espero les sea de utilidad.

miércoles, 6 de enero de 2016

WSO2 SSO: IS + DAS.

Hace poco un cliente me pedía revisara su configuración de SSO brindada por el WSO2 Identity Server 5.1.0 pues no le funcionaba al usar el WSO2 DAS 3.0.0.

El error se puede apreciar en la siguiente imagen:
image_thumb1
En mi ambiente los offset de las herramientas son los siguientes:
  • WSO2 DAS: 0
  • WSO2 IS: 5
La configuración del WSO2 DAS en el fichero authenticators.xml relacionada con el SSO es la siguiente:

<Authenticator name="SAML2SSOAuthenticator" disabled="false">
 <Priority>10</Priority>
 <Config>
   <Parameter name="LoginPage">/carbon/admin/login.jsp</Parameter>
   <Parameter name="ServiceProviderID">carbonServerDAS</Parameter>
   <Parameter name="IdentityProviderSSOServiceURL">https://localhost:9448/samlsso</Parameter>
   <Parameter name="NameIDPolicyFormat">urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</Parameter>
   <Parameter name="AssertionConsumerServiceURL">https://localhost:9443/acs</Parameter>

          <!-- <Parameter name="IdPCertAlias">wso2carbon</Parameter> -->
   <!-- <Parameter name="ResponseSignatureValidationEnabled">false</Parameter> -->
   <!-- <Parameter name="LoginAttributeName"></Parameter> -->
   <!-- <Parameter name="RoleClaimAttribute"></Parameter> -->
   <!-- <Parameter name="AttributeValueSeparator">,</Parameter> -->

          <!-- <Parameter name="JITUserProvisioning">true</Parameter> -->
   <!-- <Parameter name="ProvisioningDefaultUserstore">PRIMARY</Parameter> -->
   <!-- <Parameter name="ProvisioningDefaultRole">admin</Parameter> -->
   <!-- <Parameter name="IsSuperAdminRoleRequired">true</Parameter> -->
        </Config>

<!-- If this authenticator should skip any URI from authentication, specify it under "SkipAuthentication"
<SkipAuthentication>
  <UrlContains></UrlContains>
 </SkipAuthentication> -->

<!-- If this authenticator should skip any URI from session validation, specify it under "SkipAuthentication
 <SkipSessionValidation>
  <UrlContains></UrlContains>
 </SkipSessionValidation> -->
</Authenticator>

Como ven se define el service provider ID, se ajusta el puerto del WSO2 IS a 9448 y el puerto del DAS a 9443 y eso es todo.

En el WSO2 IS, en mi caso estaba usando la versión 5.0.0, no era la misma del cliente, y los ajustes fueron los siguientes:

Me cree un service provider: carbonServerDAS

image_thumb4 

image_thumb6

Y su configuración fue la siguiente:

image_thumb9

Al probar el SSO me funcionaba perfectamente, mientras que al cliente no, así que asumí era un problema de la versión del WSO2 IS y su configuración.

Levanté el WSO2 IS 5.1.0 creando un service provider tal como se muestra a continuación:

image_thumb11
image_thumb13

  Las opciones marcadas fueron las siguientes junto con la definición del endpoint del service provider:

image_thumb16

Luego de esta configuración al tratar de autenticarme en el WSO2 DAS pude reproducir el error.
La solución dada la pueden ver en esta pregunta de stackoverflow.

Espero les sea de utilidad.