@financialforcedev/orizuru-auth
Version:
Salesforce authentication for Heroku Node applications.
80 lines • 12.3 kB
JavaScript
;
/*
* Copyright (c) 2019, FinancialForce.com, inc
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of the FinancialForce.com, inc nor the names of its contributors
* may be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
/**
* @module client/openid/jwk
*/
const axios_1 = __importDefault(require("axios"));
const node_forge_1 = require("node-forge");
/**
* Retrieves the JSON web keys and converts them to PEM format.
*/
async function retrieveJsonWebKeysInPemFormat(jwksUri, config) {
const keyMap = await retrieveJsonWebKeys(jwksUri, config);
return Object.entries(keyMap).reduce((result, [key, value]) => {
result[key] = convertJwkToPem(value);
return result;
}, {});
}
exports.retrieveJsonWebKeysInPemFormat = retrieveJsonWebKeysInPemFormat;
/**
* Retrieves the JSON web keys.
*/
async function retrieveJsonWebKeys(jwksUri, config) {
const response = await axios_1.default.get(jwksUri, config);
if (response.status !== 200) {
throw new Error('Failed to retrieve JWKs');
}
const keys = response.data.keys;
return keys.reduce((result, key) => {
result[key.kid] = key;
return result;
}, {});
}
/**
* Converts a JWK to PEM format.
*/
function convertJwkToPem(key) {
const publicKey = node_forge_1.pki.rsa.setPublicKey(base64urlToBigInteger(key.n), base64urlToBigInteger(key.e));
return node_forge_1.pki.publicKeyToPem(publicKey).replace(/\r\n/g, '\n');
}
/**
* Converts a base64 encoded string to a node forge big integer.
* @param encodedStr The string to convert.
*/
function base64urlToBigInteger(encodedStr) {
let decodeStr = encodedStr + '==='.slice((encodedStr.length + 3) % 4);
decodeStr = decodeStr.replace(/\-/g, '+').replace(/_/g, '/');
const bytes = node_forge_1.util.decode64(decodeStr);
const hexData = node_forge_1.util.binary.hex.encode(bytes);
// @ts-ignore-next-line
return new node_forge_1.jsbn.BigInteger(hexData, 16);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiandrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2luZGV4L2NsaWVudC9vcGVuaWQvandrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHOzs7OztBQUVIOztHQUVHO0FBRUgsa0RBQWtEO0FBQ2xELDJDQUE2QztBQTREN0M7O0dBRUc7QUFDSSxLQUFLLFVBQVUsOEJBQThCLENBQUMsT0FBZSxFQUFFLE1BQTBCO0lBRS9GLE1BQU0sTUFBTSxHQUFHLE1BQU0sbUJBQW1CLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRTFELE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtRQUM3RCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQyxFQUFFLEVBQTRCLENBQUMsQ0FBQztBQUVsQyxDQUFDO0FBVEQsd0VBU0M7QUFFRDs7R0FFRztBQUNILEtBQUssVUFBVSxtQkFBbUIsQ0FBQyxPQUFlLEVBQUUsTUFBMEI7SUFFN0UsTUFBTSxRQUFRLEdBQUcsTUFBTSxlQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUVsRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFO1FBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztLQUMzQztJQUVELE1BQU0sSUFBSSxHQUFpQixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUM5QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDbEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDdEIsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDLEVBQUUsRUFBbUIsQ0FBQyxDQUFDO0FBRXpCLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsZUFBZSxDQUFDLEdBQWU7SUFFdkMsTUFBTSxTQUFTLEdBQUcsZ0JBQUcsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUNyQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQzVCLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FDNUIsQ0FBQztJQUVGLE9BQU8sZ0JBQUcsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUU3RCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxxQkFBcUIsQ0FBQyxVQUFrQjtJQUVoRCxJQUFJLFNBQVMsR0FBRyxVQUFVLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEUsU0FBUyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDN0QsTUFBTSxLQUFLLEdBQUcsaUJBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdkMsTUFBTSxPQUFPLEdBQUcsaUJBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUU5Qyx1QkFBdUI7SUFDdkIsT0FBTyxJQUFJLGlCQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUV6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOSwgRmluYW5jaWFsRm9yY2UuY29tLCBpbmNcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbixcbiAqICAgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICpcbiAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEZpbmFuY2lhbEZvcmNlLmNvbSwgaW5jIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dFxuICogICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EXG4gKiAgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFU1xuICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMXG4gKiAgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsXG4gKiAgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTXG4gKiAgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZXG4gKiAgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4gKiAgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuLyoqXG4gKiBAbW9kdWxlIGNsaWVudC9vcGVuaWQvandrXG4gKi9cblxuaW1wb3J0IGF4aW9zLCB7IEF4aW9zUmVxdWVzdENvbmZpZyB9IGZyb20gJ2F4aW9zJztcbmltcG9ydCB7IGpzYm4sIHBraSwgdXRpbCB9IGZyb20gJ25vZGUtZm9yZ2UnO1xuXG4vKipcbiAqIFtKU09OIFdlYiBLZXkgKEpXSyldKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3NTE3KVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzb25XZWJLZXkge1xuXG5cdC8qKlxuXHQgKiBbQWxnb3JpdGhtIFBhcmFtZXRlcl0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc1MTcjc2VjdGlvbi00LjQpXG5cdCAqXG5cdCAqIFRoZSBhbGdvcml0aG0gcGFyYW1ldGVyIGlkZW50aWZpZXMgdGhlIGFsZ29yaXRobSBpbnRlbmRlZCBmb3IgdXNlIHdpdGggdGhlIGtleS5cblx0ICovXG5cdGFsZzogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBCYXNlNjQgVVJMIGVuY29kZWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcHVibGljIGV4cG9uZW50IG9mIHRoZSBSU0EgS2V5LlxuXHQgKi9cblx0ZTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBbS2V5IElEIFBhcmFtZXRlcl0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc1MTcjc2VjdGlvbi00LjUpXG5cdCAqXG5cdCAqIFRoZSBrZXkgSUQgcGFyYW1ldGVyIGlzIHVzZWQgdG8gbWF0Y2ggYSBzcGVjaWZpYyBrZXkuXG5cdCAqL1xuXHRraWQ6IHN0cmluZztcblxuXHQvKipcblx0ICogW0tleSBUeXBlIFBhcmFtZXRlcl0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc1MTcjc2VjdGlvbi00LjEpXG5cdCAqXG5cdCAqIFRoZSBrZXkgdHlwZSBwYXJhbWV0ZXIgaWRlbnRpZmllcyB0aGUgY3J5cHRvZ3JhcGhpYyBhbGdvcml0aG0gZmFtaWx5IHVzZWQgd2l0aCB0aGVcblx0ICoga2V5LCBzdWNoIGFzIFwiUlNBXCIgb3IgXCJFQ1wiLlxuXHQgKi9cblx0a3R5OiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIEJhc2U2NCBVUkwgZW5jb2RlZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBtb2R1bHVzIG9mIHRoZSBSU0EgS2V5LlxuXHQgKi9cblx0bjogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBbUHVibGljIEtleSBVc2UgUGFyYW1ldGVyXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzUxNyNzZWN0aW9uLTQuMilcblx0ICovXG5cdHVzZTogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogTWFwIG9mIEpTT04gV2ViIEtleXMsIGtleWVkIGJ5IHRoZSBLZXkgSUQgUGFyYW1ldGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzb25XZWJLZXlNYXAge1xuXHRbaW5kZXg6IHN0cmluZ106IEpzb25XZWJLZXk7XG59XG5cbi8qKlxuICogTWFwIG9mIEpTT04gV2ViIEtleXMsIGtleWVkIGJ5IHRoZSBLZXkgSUQgUGFyYW1ldGVyLCBpbiBQRU0gZm9ybWF0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzb25XZWJLZXlQZW1Gb3JtYXRNYXAge1xuXHRbaW5kZXg6IHN0cmluZ106IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIEpTT04gd2ViIGtleXMgYW5kIGNvbnZlcnRzIHRoZW0gdG8gUEVNIGZvcm1hdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJldHJpZXZlSnNvbldlYktleXNJblBlbUZvcm1hdChqd2tzVXJpOiBzdHJpbmcsIGNvbmZpZzogQXhpb3NSZXF1ZXN0Q29uZmlnKSB7XG5cblx0Y29uc3Qga2V5TWFwID0gYXdhaXQgcmV0cmlldmVKc29uV2ViS2V5cyhqd2tzVXJpLCBjb25maWcpO1xuXG5cdHJldHVybiBPYmplY3QuZW50cmllcyhrZXlNYXApLnJlZHVjZSgocmVzdWx0LCBba2V5LCB2YWx1ZV0pID0+IHtcblx0XHRyZXN1bHRba2V5XSA9IGNvbnZlcnRKd2tUb1BlbSh2YWx1ZSk7XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSwge30gYXMgSnNvbldlYktleVBlbUZvcm1hdE1hcCk7XG5cbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIEpTT04gd2ViIGtleXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJldHJpZXZlSnNvbldlYktleXMoandrc1VyaTogc3RyaW5nLCBjb25maWc6IEF4aW9zUmVxdWVzdENvbmZpZykge1xuXG5cdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3MuZ2V0KGp3a3NVcmksIGNvbmZpZyk7XG5cblx0aWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gcmV0cmlldmUgSldLcycpO1xuXHR9XG5cblx0Y29uc3Qga2V5czogSnNvbldlYktleVtdID0gcmVzcG9uc2UuZGF0YS5rZXlzO1xuXHRyZXR1cm4ga2V5cy5yZWR1Y2UoKHJlc3VsdCwga2V5KSA9PiB7XG5cdFx0cmVzdWx0W2tleS5raWRdID0ga2V5O1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sIHt9IGFzIEpzb25XZWJLZXlNYXApO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYSBKV0sgdG8gUEVNIGZvcm1hdC5cbiAqL1xuZnVuY3Rpb24gY29udmVydEp3a1RvUGVtKGtleTogSnNvbldlYktleSkge1xuXG5cdGNvbnN0IHB1YmxpY0tleSA9IHBraS5yc2Euc2V0UHVibGljS2V5KFxuXHRcdGJhc2U2NHVybFRvQmlnSW50ZWdlcihrZXkubiksXG5cdFx0YmFzZTY0dXJsVG9CaWdJbnRlZ2VyKGtleS5lKVxuXHQpO1xuXG5cdHJldHVybiBwa2kucHVibGljS2V5VG9QZW0ocHVibGljS2V5KS5yZXBsYWNlKC9cXHJcXG4vZywgJ1xcbicpO1xuXG59XG5cbi8qKlxuICogQ29udmVydHMgYSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcgdG8gYSBub2RlIGZvcmdlIGJpZyBpbnRlZ2VyLlxuICogQHBhcmFtIGVuY29kZWRTdHIgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICovXG5mdW5jdGlvbiBiYXNlNjR1cmxUb0JpZ0ludGVnZXIoZW5jb2RlZFN0cjogc3RyaW5nKSB7XG5cblx0bGV0IGRlY29kZVN0ciA9IGVuY29kZWRTdHIgKyAnPT09Jy5zbGljZSgoZW5jb2RlZFN0ci5sZW5ndGggKyAzKSAlIDQpO1xuXHRkZWNvZGVTdHIgPSBkZWNvZGVTdHIucmVwbGFjZSgvXFwtL2csICcrJykucmVwbGFjZSgvXy9nLCAnLycpO1xuXHRjb25zdCBieXRlcyA9IHV0aWwuZGVjb2RlNjQoZGVjb2RlU3RyKTtcblx0Y29uc3QgaGV4RGF0YSA9IHV0aWwuYmluYXJ5LmhleC5lbmNvZGUoYnl0ZXMpO1xuXG5cdC8vIEB0cy1pZ25vcmUtbmV4dC1saW5lXG5cdHJldHVybiBuZXcganNibi5CaWdJbnRlZ2VyKGhleERhdGEsIDE2KTtcblxufVxuIl19