HotelRSV permite pasar datos encriptados usando el protocolo JSON Web Tokens, basado sobre método estándar de la industria RFC 7519 para representar reclamaciones (claims) de forma segura entre dos partes.
Esta es una forma avanzada opcional en caso que su organización requiera pasar parámetros encriptados (claims) hacia el motor de reservas, como pueden ser credenciales de usuario en un contexto de Inicio de sesión único (Single Sign On o SSO).
Es necesario acordar entre su Web Master y el Staff de Soporte de Novohit los datos (claims) que se comunicarán en el objeto JSON lo cual se hace caso por caso mediante ticket en help.novohit.com, pero a continuación se explica el proceso general de implementación del esquema.
Esquema de Implementación
Perspectiva General
El esquema de intercambio de JWT requiere de los siguientes componentes:
La instalación de hotelrsv.min.js en la página o páginas donde se incluirán botones de reservar o llamadas de acción mediante deeplink.
Un esquema lado servidor (implementado y controlado por su organización o su webmaster) donde se realice codificación del Web Token en formato JSON. En particular se requerirán estos subcomponentes:
Los datos del payload (claims) que se comunicarán en al motor de reservas HotelRSV, los cuales se acuerdan mediante ticket en help.novohit.com. A modo de ejemplo:
{ "iss": "com-organizacion-acme", "aud": "app.hotelrsv.com", "iat": 1628793662, "exp": 1628793962, "jti": "cbc0d1ee1b337e803bfb2fb6ce759a81", "username": "johndoe", "id_hotel": "100" }
El binomio de llave privada y su correspondiente llave pública que se debe usar para encriptar el JSON en formato JWT. Para esto ver la sección Servidor más abajo. La llave pública que nos enviarán vía ticket y que instalaremos en nuestro servidor para validar los datos encriptados en el JWT.
La aplicación en el servidor que ustedes realizarán para generar el JWT.
La aplicación o código JavaScript para que incluyan en el DOM el atributo
data-hotelrsv-tokenized
o en el URL el parámetrotokenized
. A modo de ejemplo, a continuación se muestra un botón de reservar cuyo atributo data-hotelhotelrsv-tokenized se genera dinámicamente:<a href="#" id="theRsvButton" data-hotelrsv-show-other-rooms="1" class="rsv-app-launcher rsv-mobile-launcher" data-hotelrsv-tokenized="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" >Book</a>
Llave Privada y Llave Pública
Generar el Binomio
Se debe generar un binomio de llaves con algoritmo RSA con mínimo 2048 bits. Puede ser también 4096, mientras más grande la llave, mayor será la información del signature del token, pero 2048 es suficiente.
Se puede usar un servicio Web para generar Binomio Llave Privada/Pública como https://travistidwell.com/jsencrypt/demo/. Tome en cuenta que es su responsabilidad salvaguardar la llave privada en todo momento.
Si tiene acceso a Shell en Linux
Navegar al directorio donde se almacenarán las llaves:
# cd /path/to/keystorage
Generar la llave privada:
# openssl genrsa -out myorganization-jwt-private.pem 2048
Generar la llave pública
# openssl rsa -pubout -in myorganization-jwt-private.pem -out myorganization-jwt-public.pem
Llave Privada
Debe resguardar la llave privada en todo momento! Es su responsabilidad!
Novohit nunca solicitará la llave privada
Llave Pública
Debe compartir con Novohit solamente la llave pública mediante ticket por help.novohit.com.
Aplicación lado Servidor para generar JWT
Queda a criterio de su desarrollador Web el cómo implementar la generación de JWT. Por ejemplo, si usan Wordpress, pueden desarrollar un script en PHP para que reciba llamadas dinámicas AJAX y genere el Token.
Ejemplo de aplicación en PHP
<?php require_once __DIR__ . '/vendor/autoload.php'; use Firebase\JWT\JWT; //-- when keys are loaded from file $passphrase = ''; $privateKeyFile = __DIR__ . '/jwt-private.pem'; $privateKey = openssl_pkey_get_private( file_get_contents($privateKeyFile), $passphrase ); $publicKeyFile = __DIR__ . '/jwt-public.pem'; $publicKey = file_get_contents($publicKeyFile); $iat = time(); $interval = 5; //-- minutes $jti = bin2hex(random_bytes(16)); $data = array( 'iss' => 'com-organizacion-acme', 'aud' => 'app.hotelrsv.com', 'iat' => $iat, 'exp' => $iat + $interval * 60, 'jti' => $jti, 'hotelrsv_id_h' => 100, 'username' => 'johndoe', 'other_fields' => 'foo bar' ); $token = JWT::encode($data, $privateKey, 'RS256'); $aToken = array('token' => $token); header('Content-Type: application/json'); echo json_encode($aToken);
JavaScript para solicitar el JWT e inyectarlo en el DOM
Usted puede adicionar el token dinámicamente en cualquier Botón de Reserva simplemente adicionando el atributo data-hotelrsv-tokenized
al elemento HTML.
Puesto que el token tiene validez de máximo 12 minutos, se recomienda generarlo dinámicamente a cada llamada a un botón de reservar.
Para esto pusimos a su disposición una “Interface Gancho” o Hook en Javascript llamada nvhHookBeforeRsvAppLauncher
que le permite ejecutar Javascript antes de que se dispare el motor de reservaciones. Es allí donde puede definir dinámicamente la llamada a su aplicación servidor para generar el JWT dinámicamente.
Asegúrese de realizar la llamada después de la instalación de hotelrsv.min.js
A continuación un ejemplo basado en jQuery y AJAX que adiciona el atributo data-hotelrsv-tokenized
a un botón con ID theRsvButton
:
//... <script> function nvhHookBeforeRsvAppLauncher() { jQuery.ajax({ type: 'POST', url: 'https://api.yourserver.com/jwt/buildToken.php', success: function(data) { console.log(data.token); jQuery("#theRsvButton").attr("data-hotelrsv-tokenized",data.token); } }); } </script> //... <body> //... <a href="#" id="theRsvButton" class="rsv-app-launcher rsv-mobile-launcher">Book</a>
Asegúrese que el servidor que atiende llamadas para construir token (en el ejemplo https://api.yourserver.com/jwt/buildToken.php
) cumpla con requisitos CORS.
De esta manera, cuando el usuario final da click en el botón id="theRsvButton"
cuya clase es class="rsv-app-launcher"
(ver Botones de Reservar – Llamadas de Accion ) se ejecutará primero la función nvhHookBeforeRsvAppLauncher
y al recibir el JWT del servidor, se insertará el atributo data-hotelrsv-tokenized
al botón de reserva y se ejecutará el motor de reservaciones. hotelrsv.min.js se encargará automáticamente de pasara el valor del atributo data-hotelrsv-tokenized
a la aplicación.