UNPKG

@financialforcedev/orizuru-auth

Version:

Salesforce authentication for Heroku Node applications.

80 lines 12.3 kB
"use strict"; /* * 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