UNPKG

echo.io

Version:

A socket.io server implementation for laravel-echo

95 lines (80 loc) 1.91 kB
'use strict'; 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;