Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

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).

...

Note

Este manual se ha movido a help.novohit.com

...

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:

Code Block
{
  "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ámetro tokenized. A modo de ejemplo, a continuación se muestra un botón de reservar cuyo atributo data-hotelhotelrsv-tokenized se genera dinámicamente:

Code Block
<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.

Tip

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:

Code Block
# cd /path/to/keystorage

Generar la llave privada:

Code Block
# openssl genrsa -out myorganization-jwt-private.pem 2048

Generar la llave pública

Code Block
# openssl rsa -pubout -in myorganization-jwt-private.pem -out myorganization-jwt-public.pem

Llave Privada

Warning

Debe resguardar la llave privada en todo momento! Es su responsabilidad!

Note

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

Code Block
<?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.

Note

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:

Code Block
//...
<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>

...

Tip

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.

...

 → Base de Conocimientos