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.
![HCL Commerce Version 9.1.7.0 or later](../../base/images/9170plus.png)
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.
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
-
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
yclientSecret
(oappId
yappSecret
). Es posible que reciba su derechoclientId
inmediatamente después de crear la aplicación. Puede buscarclientSecret
en la configuración de la aplicación. Utilizará estos valores en el siguiente paso. -
Registre la aplicación de red social en la base de datos de HCL Commerce.
Para HCL Commerce 9.1.7.0 o superior:
-
Ejecute las siguientes secuencias SQL para registrar los detalles de la aplicación en la tabla STORECONF.
Donde:insert into storeconf values(store_id, 'SNSName.oauth.clientIdField', 'clientIdFieldName', 0); insert into storeconf values(store_id, 'SNSName.oauth.clientSecretField', 'clientSecretFieldName', 0);
- 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.
- Inserte el
store_id
y eltransport_id
en la tabla STORETRANS.Por ejemplo:INSERT INTO STORETRANS (TRANSPORT_ID, STORE_ID, ACTIVE, OPTCOUNTER) VALUES (-123, 1, 1, 0);
- Cifre el ID de cliente y los valores secretos de cliente, y guárdelos en la tabla CSEDITATT.
- 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.
- Introduzca los valores cifrados en la tabla CSEDITATT.
DondeINSERT 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);
- 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.
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.
Donde: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);
- 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.
- 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.
- 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.
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 invoqueMyAccountDisplayJS.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 llamadoOpenUserRegisterCmd
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, comologonId
,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
, eluserIdField
exclusivo del sitio de red social es obligatorio. - 2 Al correlacionar con
name
, ellastNameField
exclusivo del sitio de red social es obligatorio. - 3 Al correlacionar con
email
, elemailField
exclusivo del sitio de red social es obligatorio. - 4 Al correlacionar con
name
, elnickNameField
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 aOpenUserRegisterCmd.setInputParameters()
. - 1 Al correlacionar con
- 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 endonde host es el nombre de host web para HCL Commerce y port es el número de puerto web para HCL Commerce.MyAccountDisplayJS.validateOauthToken()
. Por ejemplo:'https://host:port/wcs/shop/AjaxLogonForm?myAcctMain=1&catalogId='+${catalogId}+'&langId='+${langId}+'&storeId='+${storeId};