echo.io
Version:
A socket.io server implementation for laravel-echo
95 lines (80 loc) • 1.91 kB
JavaScript
;
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
var decoder = require('base64url');
var crypto = require('crypto');
/**
* Authenticate and decode token data.
*
* @param token
* @param key
*
* @return {false|Object}
*/
var verify = function verify(token, key) {
token = token.split('.');
if (token.length !== 3 || !key || !validate.apply(undefined, [key].concat(_toConsumableArray(token)))) {
return false;
}
return decode(token[1]);
};
/**
* Generate a token signature .
*
* @param key
* @param data
*
* @return {String}
*/
var sign = function sign(key, data) {
return decoder.fromBase64(crypto.createHmac('sha256', key).update(data).digest('base64'));
};
/**
* Validate token.
*
* @param key
* @param header
* @param status
* @param signature
*
* @return {Boolean}
*/
var validate = function validate(key, header, status, sgntr) {
var signature = sign(key, header + '.' + status);
return compare(sgntr, signature);
};
/**
* Decode data payload.
*
* @param status
*
* @return {false|Object}
*/
var decode = function decode(status) {
try {
status = decoder.decode(status);
if (typeof status !== 'string') {
return status;
}
return JSON.parse(status);
} catch (e) {}
return false;
};
/**
* Compare signature string.
*
* @param sgntr
* @param sgntr2
*
* @return {Boolean}
*/
var compare = function compare(sgntr, sgntr2) {
try {
return crypto.timingSafeEqual(Buffer.from(sgntr), Buffer.from(sgntr2));
} catch (e) {
return false;
}
};
/**
* Export modules.
*/
module.exports = verify;