Inicia sesión - External Authorize
Actualmente el sistema de usuarios en DEUNA funciona con JWT generados desde DEUNA ONE. El actualmente sistema soporta passwordless SMS, Email, usuario y contraseña. Ciertos clientes ya poseen su sistema de autenticación de usuario y con ello no pueden migrarse de forma rápida hacia nuestro sistema.
Por esta misma situación se desarrollo un endpoint el cual recibe un mensaje encriptado con una llave pública y el API Key(privado) para poder entregar de forma segura un token autorizado por DEUNA ONE y el cliente.
URL
En DEUNA actualmente tenemos dos ambientes y con ello dos direcciones distintas, para el ambiente de prueba llamado staging utilizamos https://staging-apigw.getduna.com y para producción https://apigw.getduna.com
Por ello los endpoints a utilizar respectivamente son:
- Staging: https://staging-apigw.getduna.com/users/external-authorize
- Production: https://staging-apigw.getduna.com/users/external-authorize
Headers
Para poder realizar una solicitad de generación de un nuevo token debemos enviar dos headers de forma obligatoria
- X-Api-Key: Llave con la cual se intenta hacer inicio de sesión.
- X-Auth-Message: Mensaje encriptado con el email del usuario a intentar loguear.
¿Cómo encriptar el mensaje?
Para poder encriptar un mensaje necesitaremos la llave pública antes generada para el cliente para ello se debe solicitar directamente con DEUNA por ahora el cual retornará una llave pública con un formato similar a este:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0
FPqri0cb2JZfXJ/DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/
3j+skZ6UtW+5u09lHNsj6tQ51s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQAB
-----END PUBLIC KEY-----
Con esta llave proporcionada debemos encriptar el JSON con el email al cual buscamos generar un nuevo token, para luego hacer un encoding en base64 y poder enviarlo desde el header hacía nuestro API Gateway.
# Encrypt message with public-key
echo '{"email":"[email protected]"}' | openssl pkeyutl -encrypt -pubin -inkey pem.pub -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256 > message.json.enc
# Encode file to base64
base64 message.json.enc > message.base64
const crypto = require("crypto");
// This is the data we want to encrypt
const data = `{"email": "[email protected]"}`;
const encryptedData = crypto.publicEncrypt({
key: process.ENV.PublicKey, // Contact to d-Una for this key
padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
oaepHash: "sha256",
},
Buffer.from(data)
);
// This string is for X-Auth-Message
const authMessage = encryptedData.toString("base64");
Como generar un token de usuario?
Para generar un nuevo token debemos tomar el mensaje antes generado y enviarlo de esta forma al endpoint antes señalado
curl --location --request POST 'https://staging-apigw.getduna.com:443/users/external-authorize' \
--header 'X-Auth-Message: XKQ3P6VGgCJhsPxCWznS7XstlbR299UtSEr5SppSPCWUOHoySVTNt8XuKjYy0nMYB+krdQ/zHyCieIAfkFC7OXaexufWfguAJcCKGTkDdI/tFj5YMIoo9z4VipM1iXZfqCyq1Z7XSkiemKZv3z92w2f0B7qTp19GBiE3bCsRo/PIFItx80g/P4WrFHdhNLqzdkTkx7zqetvwVr5bd2CQ6YRfmTLrjlv/JgZKu5vxd6m2Nuxc4YHtnDxGf0RwVaHP4DUreTN0uxqDqEU+zqZJxvJfEkdItYh2eVYrWAHrQppfvl098yPt3w5gt/QTFVVK8uM6ixIM6mcT/YJD1CAXoE/6QDeYcKPF3SGlERZhCMEIos8TFIcseXONEj9rg4W2z1IdarNMSJkBW3Kk+8KHO/4xW1tCCYr2Boa1ewx0bR7EbaGvt4Q7hZqSUDgbdzG+FSBS0J8HEFeGvp3RGM51yZX9iDSot76eS91YI83ZJj5mXCHdf/q+jXOpR2HkWjntXjrIvmEQU8c516DNPk1q4YanfAOkqSKmVbcbyDRA91xm0GHr1S2GAKlFl/fVf2Bf1A5Gph6xYxtK7H9YeIC6j/2PP3MrAQqEFJ+AuqTJ+HvYu6mQtuZaVt811MH8f37qi6JIe+e594Z9GRsMw/+sw32Bz+d1v/PCt/+HmvTGvwc=' \
--header 'X-Api-Key: ****'
const axios = require('axios');
const data = {
method: 'post',
url: 'https://staging-apigw.getduna.com:443/users/external-authorize',
headers: {
'X-Auth-Message': 'XKQ3P6VGgCJhsPxCWznS7XstlbR299UtSEr5SppSPCWUOHoySVTNt8XuKjYy0nMYB+krdQ/zHyCieIAfkFC7OXaexufWfguAJcCKGTkDdI/tFj5YMIoo9z4VipM1iXZfqCyq1Z7XSkiemKZv3z92w2f0B7qTp19GBiE3bCsRo/PIFItx80g/P4WrFHdhNLqzdkTkx7zqetvwVr5bd2CQ6YRfmTLrjlv/JgZKu5vxd6m2Nuxc4YHtnDxGf0RwVaHP4DUreTN0uxqDqEU+zqZJxvJfEkdItYh2eVYrWAHrQppfvl098yPt3w5gt/QTFVVK8uM6ixIM6mcT/YJD1CAXoE/6QDeYcKPF3SGlERZhCMEIos8TFIcseXONEj9rg4W2z1IdarNMSJkBW3Kk+8KHO/4xW1tCCYr2Boa1ewx0bR7EbaGvt4Q7hZqSUDgbdzG+FSBS0J8HEFeGvp3RGM51yZX9iDSot76eS91YI83ZJj5mXCHdf/q+jXOpR2HkWjntXjrIvmEQU8c516DNPk1q4YanfAOkqSKmVbcbyDRA91xm0GHr1S2GAKlFl/fVf2Bf1A5Gph6xYxtK7H9YeIC6j/2PP3MrAQqEFJ+AuqTJ+HvYu6mQtuZaVt811MH8f37qi6JIe+e594Z9GRsMw/+sw32Bz+d1v/PCt/+HmvTGvwc=',
'X-Api-Key': '****'
}
};
axios(data)
.then(function (response) {
console.log(JSON.stringify(response.data));
})
.catch(function (error) {
console.log(error);
});
Estructura de respuesta - Status 200 OK
{
"refresh_token": "",
"token": ""
}
Nota:
Todas las llamadas a este endpoint deben ser desde el servidor por seguridad, además cualquier tipo de llamada desde algún navegador o cliente comenzará ha ser bloqueada.
Updated over 1 year ago