Implementar OAuth 2.0 para el inicio de sesión social en el escaparate

Puede implementar el inicio de sesión social en el escaparate HCL Commerce para permitir que los usuarios inicien sesión en la tienda utilizando una cuenta de red social, en lugar de utilizar las credenciales dedicadas para HCL Commerce.

Importante: HCL Commerce Version 9.1.7.0 or laterEsta integración se ha mejorado en HCL Commerce 9.1.7.0 y requiere actualizaciones en la configuración para continuar trabajando. Si ha configurado previamente esta integración, debe cifrar y migrar manualmente los valores para los valores client_id y client_secret, y almacenarlos en la tabla CSEDITAT. A continuación, estos valores deben eliminarse de la tabla STORECONF.

Por qué y cuándo se efectúa esta tarea

Se introdujeron nuevas API de inicio de sesión HCL Commerce para dar soporte a la autenticación en el escaparate con sitios de redes sociales (SNS), como Facebook, Google+, etc.

Generalmente, los sitios de redes sociales proporcionan API o SDK estándar en varios idiomas para facilitar a los desarrolladores la habilitación de inicio de sesión en su sitio web o aplicaciones. Los flujos de interacción se basan en el protocolo OAuth 2.0. Para las aplicaciones web, JavaScript SDK es el método recomendado para la integración.

En esta tarea se presupone que sigue una guía del sitio de redes sociales para utilizar su JavaScript SDK para habilitar el inicio de sesión en la tienda. Si integra con Google o Facebook, puede utilizar la siguiente documentación:

El siguiente procedimiento le indica cómo completar la integración en el lado de HCL Commerce, configurando el proceso de inicio de sesión para utilizar la señal de acceso proporcionada por el sitio de la red social.

Procedimiento

  1. Cree una aplicación de red social para HCL Commerce.

    Utilizando la plataforma de red social abierta, cree una aplicación para HCL Commerce. Utilice la guía de desarrollo específica del sitio de red social con el que está integrando.

    Después de crear la aplicación, se otorga un par de clientId y clientSecret (o appId y appSecret). Es posible que reciba su derecho clientId inmediatamente después de crear la aplicación. Puede buscar clientSecret en la configuración de la aplicación. Utilizará estos valores en el siguiente paso.

  2. Registre la aplicación de red social en la base de datos de HCL Commerce.
    • HCL Commerce Version 9.1.7.0 or laterPara HCL Commerce 9.1.7.0 o superior:
      1. Ejecute las siguientes secuencias SQL para registrar los detalles de la aplicación en la tabla STORECONF.
        insert into storeconf values(store_id, 'SNSName.oauth.clientIdField', 'clientIdFieldName', 0);
        insert into storeconf values(store_id, 'SNSName.oauth.clientSecretField', 'clientSecretFieldName', 0);
        
        Donde:
        store_id
        Es el ID de la tienda de HCL Commerce. Por ejemplo, 1001.
        SNSName
        Es el nombre del sitio de red social. Por ejemplo, Google o Facebook. Puede utilizar varios inicios de sesión de SNS. Se utiliza el prefijo de SNSName en cada configuración para distinguir entre distintos sitios de redes sociales en HCL Commerce.
        clientIdFieldName
        El nombre del campo de ID de cliente para el sitio de red social que proporciona las convenciones de nombre. Los distintos sitios de redes sociales pueden tener nombres de campo diferentes. Por ejemplo, el nombre del campo para Google es client_id.
        clientSecretFieldName
        El nombre del campo secreto de cliente para el sitio de red social que proporciona las convenciones de nombre. Los distintos sitios de redes sociales pueden tener nombres de campo diferentes. Por ejemplo, el nombre del campo para Google es client_secret.
      2. Inserte el store_id y el transport_id en la tabla STORETRANS.
        Por ejemplo:
        INSERT INTO STORETRANS (TRANSPORT_ID, STORE_ID, ACTIVE, OPTCOUNTER) VALUES (-123, 1, 1, 0);
      3. Cifre el ID de cliente y los valores secretos de cliente, y guárdelos en la tabla CSEDITATT.
        1. Cifre los valores client_id y client_secret con la clave de comerciante utilizando el wcs_encryptprograma de utilidad. Debe especificar la clave de comerciante como un parámetro.
        2. Introduzca los valores cifrados en la tabla CSEDITATT.
          INSERT INTO CSEDITATT (CONNSPECATTNAME, CONNSPECATTVALUE, CSEDITATT_ID, TRANSPORT_ID, STORE_ID, INSTANCE_NUM, CUSTOMIZABLE) VALUES ('OAuthLogin_SNSName_clientIdFieldName', 'encryptedClientId', minCseditattId - 1, -123, 1, -1, 0);  
          INSERT INTO CSEDITATT (CONNSPECATTNAME, CONNSPECATTVALUE, CSEDITATT_ID, TRANSPORT_ID, STORE_ID, INSTANCE_NUM, CUSTOMIZABLE) VALUES ('OAuthLogin_SNSName_clientSecretFieldName', 'encryptedClientSecret', minCseditattId - 2, -123, 1, -1, 0);   
          
          Donde
          SNSName
          Es el nombre del sitio de red social. Por ejemplo, Google o Facebook. Puede utilizar varios inicios de sesión de SNS. Se utiliza el prefijo de SNSName en cada configuración para distinguir entre distintos sitios de redes sociales en HCL Commerce.
          clientIdFieldName
          El nombre del campo de ID de cliente para el sitio de red social que proporciona las convenciones de nombre. Los distintos sitios de redes sociales pueden tener nombres de campo diferentes. Por ejemplo, el nombre del campo para Google es client_id.
          clientSecretFieldName
          El nombre del campo secreto de cliente para el sitio de red social que proporciona las convenciones de nombre. Los distintos sitios de redes sociales pueden tener nombres de campo diferentes. Por ejemplo, el nombre del campo para Google es client_secret.
          encryptedClientId
          El ID de cliente cifrado utilizando la utilidad wcs_encrypt y la clave de comerciante.
          encryptedClientSecret
          El secreto de cliente cifrado utilizando la utilidad wcs_encrypt y la clave de comerciante.
          minCseditattId
          El valor mínimo de la clave principal actual en la tabla CSEDITATT. En SQL, esto se reduce en uno, y luego se utiliza para la clave principal del nuevo registro. Esto es para evitar conflictos con otras entradas que podrían añadirse a esta tabla a través Management Center de en el futuro.
        Por ejemplo, para almacenar un ID de cliente de Google, client_id, y un secreto de cliente, client_secret, ambas secuencias de SQL aparecerán de la siguiente manera.
        INSERT INTO CSEDITATT (CONNSPECATTNAME, CONNSPECATTVALUE, CSEDITATT_ID, TRANSPORT_ID, STORE_ID, INSTANCE_NUM, CUSTOMIZABLE) VALUES ('OAuthLogin_Google_client_id', 'encryptedClientId', -1, -123, 1, -1, 0);  
        INSERT INTO CSEDITATT (CONNSPECATTNAME, CONNSPECATTVALUE, CSEDITATT_ID, TRANSPORT_ID, STORE_ID, INSTANCE_NUM, CUSTOMIZABLE) VALUES ('OAuthLogin_Google_client_secret', 'encryptedClientSecret', -2, -123, 1, -1, 0);
    • Para versiones de HCL Commerce 9.1.x.0 anteriores a 9.1.7.0:
      Ejecute las siguientes secuencias SQL para registrar los detalles de la aplicación en la tabla STORECONF mediante los ID que adquirió en el paso anterior.
      insert into storeconf values(store_id, 'SNSName.oauth.clientIdField', 'clientIdFieldName', 0);
      insert into storeconf values(store_id, 'SNSName.oauth.clientSecretField', 'clientSecretFieldName', 0);
      insert into storeconf values(store_id, 'SNSName_clientIdFieldName', 'ClientId', 0);
      insert into storeconf values(store_id, 'SNSName_clientSecretFieldName', 'ClientSecret', 0);
      Donde:
      store_id
      Es el ID de la tienda de HCL Commerce. Por ejemplo, 1001.
      SNSName
      Es el nombre del sitio de red social. Por ejemplo, Google o Facebook. Puede utilizar varios inicios de sesión de SNS. Se utiliza el prefijo de SNSName en cada configuración para distinguir entre distintos sitios de redes sociales en HCL Commerce.
      clientIdFieldName
      El nombre del campo de ID de cliente para el sitio de red social que proporciona las convenciones de nombre. Los distintos sitios de redes sociales pueden tener nombres de campo diferentes. Por ejemplo, el nombre del campo para Google es client_id.
      clientSecretFieldName
      El nombre del campo secreto de cliente para el sitio de red social que proporciona las convenciones de nombre. Los distintos sitios de redes sociales pueden tener nombres de campo diferentes. Por ejemplo, el nombre del campo para Google es client_secret.
      ClientId
      El valor de ID de cliente para la aplicación registrada en el sitio de redes sociales.
      ClientSecret
      El valor de cliente secreto para la aplicación registrada en el sitio de redes sociales.
  3. Siga la guía de implementación del sitio de redes sociales para habilitar el inicio de sesión social en el escaparate.
    La ejecución de este paso incluye:
    • Al configurar el SDK de JavaScript, especifique un ID de la aplicación en el paso anterior.
    • Añadir el botón de inicio de sesión a la tienda.
    • Definir la función de devolución de llamada para manejar el resultado de inicio de sesión.
      En la función de devolución de llamada después de un inicio de sesión satisfactorio, llame a MyAccountDisplayJS.validateOauthToken() con la señal de acceso, el ID de usuario o incluso otra información de perfil de usuario en la respuesta para iniciar el proceso de inicio de sesión del servidor. Por ejemplo:
      function statusChangeCallback(response){
              if(response.status == 'connected'){
                 var param = {id:response.authResponse.userID};
                 MyAccountDisplayJS.validateOauthToken(response.authResponse.accessToken, 1, 'facebook', url, params) ;          
              }       
        }
      Nota: El parámetro URL debe ser el URL posterior al inicio de sesión.
  4. Configure el proceso de inicio de sesión HCL Commerce para utilizar la verificación de señales y la correlación de perfiles de usuario.
    El método MyAccountDisplay.validateOauthToken(token, isToken, provider, url, parameters) inicia el proceso de inicio de sesión del servidor, donde:
    Señal de
    El código de autorización o el código de intercambio para la señal.
    isToken
    El valor de 1, si utiliza un código de autorización, o bien 0.
    provider
    El nombre del sitio de red social.
    postLogonUrl
    El URL de redirección después de iniciar sesión satisfactoriamente.
    Este método JavaScript invocará la API de REST POST /store/{storeId}/loginidentity/oauth_validate para iniciar el proceso de inicio de sesión del servidor. El proceso de inicio de sesión se puede dividir en los siguientes pasos.
    • Verifique la señal de acceso que se transmite de la tienda al servidor.

      Para evitar un ataque en esta API de inicio de sesión social, es obligatoria la verificación de señal en el proceso de inicio de sesión. Los distintos sitios de redes sociales utilizan mecanismos de verificación diferentes, pero todos proporcionan puntos finales o bibliotecas de cliente para la validación de señales. De forma predeterminada, la API llama a un punto final de validación de señal preconfigurado, compone la solicitud de acuerdo con un conjunto de campos preconfigurados y comprueba el código de estado HTTP en la respuesta. Si el código de estado es 200 y no contiene errores, la validación es satisfactoria.

      Si el sitio de red social con el que está integrando proporciona un mecanismo similar como comportamiento predeterminado, debe configurar varios campos en la tabla STORECONF. Ejecute las siguientes sentencias de SQL:
      insert into storeconf values(store_id, 'SNSName_provider_verifytoken_url', 'https://graph.SocialNetworkingSite.com/debug_token', 0);
      insert into storeconf values(store_id, 'SNSName.oauth.verifiedTokenField', 'input_token', 0);
      Nota: verifiedTokenField es el nombre de campo que se añade al punto final de verificación de señal.

      Si tiene más lógica de validación contra la respuesta, puede ampliar OAuthTokenValidationCmdImpl.validateResult() para añadir la lógica de validación.

      Algunos sitios de redes sociales proporcionan una biblioteca de cliente para la verificación de señal. En este caso, puede escribir una nueva implementación para que OAuthTokenValidationCmd utilice su biblioteca de cliente para la validación. Y registre el mandato nuevo .impl en la tabla CMDREG:

    • Si la validación es correcta, correlacione la información de perfil de usuario que ha recibido del sitio de red social con el perfil de usuario de HCL Commerce.
      Nota: Esto solo es necesario si ha utilizado nombres de campo diferentes para la información de perfil de usuario. De forma predeterminada, las correlaciones para los cuatro campos (id, lastName, email, nickName) ya están configuradas. Si utiliza los nombres de campo predeterminados, puede saltarse este paso.

      La información de perfil de usuario, incluido el nombre, el correo electrónico, etc., se puede recuperar a través de la API de perfil de usuario del sitio de red social, que se incluye en el JavaScript SDK.

      Puede transmitir esta información de perfil a la correlación param cuando invoque MyAccountDisplayJS.validateOauthToken() como se ha mencionado anteriormente y, a continuación, se pasan a la API REST de inicio de sesión.

      La API lee la información de perfil de usuario de la entrada de la API y, a continuación, la correlaciona con el HCL Commerce perfil de usuario una vez que la validación de señal se realice satisfactoriamente. Se utiliza un mandato de controlador llamado OpenUserRegisterCmd para correlacionar perfiles entre el sitio de redes sociales y HCL Commerce. Para garantizar una correlación correcta, debe configurar los nombres de campo que se correlacionan con los campos de usuario de HCL Commerce, como logonId, lastName, email, nickName etc., en la entrada del mandato. Por ejemplo:
      1insert into storeconf values(store_id, 'SNSName.user.uniqueIdField', 'id', 0); 
      2insert into storeconf values(store_id, 'SNSName.user.lastNameField', 'name', 0);
      3insert into storeconf values(store_id, 'SNSName.user.emailField', 'email', 0); 
      4insert into storeconf values(store_id, 'SNSName.user.nickNameField', 'name', 0);
      • 1 Al correlacionar con logonId, el userIdField exclusivo del sitio de red social es obligatorio.
      • 2 Al correlacionar con name, el lastNameField exclusivo del sitio de red social es obligatorio.
      • 3 Al correlacionar con email, el emailField exclusivo del sitio de red social es obligatorio.
      • 4 Al correlacionar con name, el nickNameField exclusivo del sitio de red social es opcional.

      Si, en su caso, no se ha recuperado la información de perfil de usuario del escaparate, puede recuperarse desde el servidor utilizando la API REST. Para ello, personalice OpenUserRegisterCmd para invocar la API de perfil de usuario del sitio de redes sociales y, a continuación, correlacione la respuesta con HCL Commerce.

      Si se recupera la información de perfil de usuario durante la validación de señal, devuélvalas ampliando OAuthTokenValidationCmd.getProfileMap(). De forma predeterminada, la correlación devuelta se pasa a OpenUserRegisterCmd.setInputParameters().

    • Continúe el proceso de inicio de sesión como un comprador registrado.

      De acuerdo con la información de perfil de usuario, en particular el campo logonId, el usuario se determina como un usuario existente o uno nuevo. Si el usuario es un usuario nuevo, examine el escaparate como un comprador registrado.

      Cuando se completa el proceso de inicio de sesión, la tienda redirige al URL de conexión posterior, que se pasa en MyAccountDisplayJS.validateOauthToken(). Por ejemplo:
      'https://host:port/wcs/shop/AjaxLogonForm?myAcctMain=1&catalogId='+${catalogId}+'&langId='+${langId}+'&storeId='+${storeId};
      donde host es el nombre de host web para HCL Commerce y port es el número de puerto web para HCL Commerce.