UNPKG

@financialforcedev/orizuru-auth

Version:

Salesforce authentication for Heroku Node applications.

108 lines 13.2 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 middleware/identity */ const axios_1 = __importDefault(require("axios")); const __1 = require("../.."); const accessToken_1 = require("./common/accessToken"); const fail_1 = require("./common/fail"); /** * Returns an express middleware that uses the [Identity URL](https://help.salesforce.com/articleView?id=remoteaccess_using_openid.htm) * to retrieve information about the current Salesforce user. * * This can be used in tandem with the **auth callback** middleware to retrieve the user information with the granted access token. * * @fires EVENT_USER_IDENTITY_RETRIEVED * @param app The Orizuru server instance. * @returns An express middleware that retrieves the identity information. */ function createMiddleware(app) { return async function retrieveIdentityInformation(req, res, next) { try { const identityUrl = validateRequest(req); const identityResponse = await axios_1.default.get(identityUrl, { headers: { Authorization: req.headers.authorization } }); setIdentityInformation(app, req, identityResponse.data); next(); } catch (error) { fail_1.fail(app, error, req, res, next); } }; } exports.createMiddleware = createMiddleware; /** * Validate the request. * * @param req The HTTP request. * @returns The Identity URL. */ function validateRequest(req) { accessToken_1.extractAccessToken(req); if (!req.orizuru) { throw new Error('Missing required object parameter: orizuru.'); } if (!req.orizuru.salesforce) { throw new Error('Missing required object parameter: orizuru[salesforce].'); } const salesforce = req.orizuru.salesforce; if (!salesforce.userInfo) { throw new Error('Missing required object parameter: orizuru[salesforce][userInfo].'); } const userInfo = salesforce.userInfo; if (!userInfo.url) { throw new Error('Missing required string parameter: orizuru[salesforce][userInfo][url].'); } if (userInfo.validated === false) { throw new Error('The Identity URL must be validated.'); } if (!userInfo.validated) { throw new Error('Missing required string parameter: orizuru[salesforce][userInfo][validated].'); } return userInfo.url; } /** * Sets the identity information in the Orizuru context and emits a user identity * retrieved event. * * @param app The Orizuru server instance. * @param req The HTTP request. * @param identity The Salesforce Identity. */ function setIdentityInformation(app, req, identity) { req.orizuru.salesforce.identity = identity; app.emit(__1.EVENT_USER_IDENTITY_RETRIEVED, `Identity information retrieved for user (${identity.username}) [${req.ip}].`); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaW5kZXgvbWlkZGxld2FyZS9pZGVudGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRzs7Ozs7QUFFSDs7R0FFRztBQUVILGtEQUF3RDtBQUl4RCw2QkFBMEU7QUFDMUUsc0RBQTBEO0FBQzFELHdDQUFxQztBQUVyQzs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxHQUFvQjtJQUVwRCxPQUFPLEtBQUssVUFBVSwyQkFBMkIsQ0FBQyxHQUFZLEVBQUUsR0FBYSxFQUFFLElBQWtCO1FBRWhHLElBQUk7WUFFSCxNQUFNLFdBQVcsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFekMsTUFBTSxnQkFBZ0IsR0FBc0MsTUFBTSxlQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRTtnQkFDeEYsT0FBTyxFQUFFO29CQUNSLGFBQWEsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWE7aUJBQ3hDO2FBQ0QsQ0FBQyxDQUFDO1lBRUgsc0JBQXNCLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUV4RCxJQUFJLEVBQUUsQ0FBQztTQUVQO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZixXQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ2pDO0lBRUYsQ0FBQyxDQUFDO0FBRUgsQ0FBQztBQXhCRCw0Q0F3QkM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsZUFBZSxDQUFDLEdBQVk7SUFFcEMsZ0NBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFeEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUU7UUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO0tBQy9EO0lBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFO1FBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMseURBQXlELENBQUMsQ0FBQztLQUMzRTtJQUVELE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO0lBQzFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFO1FBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUVBQW1FLENBQUMsQ0FBQztLQUNyRjtJQUVELE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUM7SUFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3RUFBd0UsQ0FBQyxDQUFDO0tBQzFGO0lBRUQsSUFBSSxRQUFRLENBQUMsU0FBUyxLQUFLLEtBQUssRUFBRTtRQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7S0FDdkQ7SUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRTtRQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLDhFQUE4RSxDQUFDLENBQUM7S0FDaEc7SUFFRCxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUM7QUFFckIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLHNCQUFzQixDQUFDLEdBQW9CLEVBQUUsR0FBWSxFQUFFLFFBQTRCO0lBRS9GLEdBQUcsQ0FBQyxPQUFRLENBQUMsVUFBVyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFFN0MsR0FBRyxDQUFDLElBQUksQ0FBQyxpQ0FBNkIsRUFBRSw0Q0FBNEMsUUFBUSxDQUFDLFFBQVEsTUFBTSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUV4SCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOSwgRmluYW5jaWFsRm9yY2UuY29tLCBpbmNcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbixcbiAqICAgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICpcbiAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEZpbmFuY2lhbEZvcmNlLmNvbSwgaW5jIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dFxuICogICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EXG4gKiAgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFU1xuICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMXG4gKiAgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsXG4gKiAgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTXG4gKiAgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZXG4gKiAgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4gKiAgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuLyoqXG4gKiBAbW9kdWxlIG1pZGRsZXdhcmUvaWRlbnRpdHlcbiAqL1xuXG5pbXBvcnQgeyBBeGlvc1Jlc3BvbnNlLCBkZWZhdWx0IGFzIGF4aW9zIH0gZnJvbSAnYXhpb3MnO1xuXG5pbXBvcnQgeyBOZXh0RnVuY3Rpb24sIFJlcXVlc3QsIFJlcXVlc3RIYW5kbGVyLCBSZXNwb25zZSB9IGZyb20gJ0BmaW5hbmNpYWxmb3JjZWRldi9vcml6dXJ1JztcblxuaW1wb3J0IHsgRVZFTlRfVVNFUl9JREVOVElUWV9SRVRSSUVWRUQsIFNhbGVzZm9yY2VJZGVudGl0eSB9IGZyb20gJy4uLy4uJztcbmltcG9ydCB7IGV4dHJhY3RBY2Nlc3NUb2tlbiB9IGZyb20gJy4vY29tbW9uL2FjY2Vzc1Rva2VuJztcbmltcG9ydCB7IGZhaWwgfSBmcm9tICcuL2NvbW1vbi9mYWlsJztcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGV4cHJlc3MgbWlkZGxld2FyZSB0aGF0IHVzZXMgdGhlIFtJZGVudGl0eSBVUkxdKGh0dHBzOi8vaGVscC5zYWxlc2ZvcmNlLmNvbS9hcnRpY2xlVmlldz9pZD1yZW1vdGVhY2Nlc3NfdXNpbmdfb3BlbmlkLmh0bSlcbiAqIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IFNhbGVzZm9yY2UgdXNlci5cbiAqXG4gKiBUaGlzIGNhbiBiZSB1c2VkIGluIHRhbmRlbSB3aXRoIHRoZSAqKmF1dGggY2FsbGJhY2sqKiBtaWRkbGV3YXJlIHRvIHJldHJpZXZlIHRoZSB1c2VyIGluZm9ybWF0aW9uIHdpdGggdGhlIGdyYW50ZWQgYWNjZXNzIHRva2VuLlxuICpcbiAqIEBmaXJlcyBFVkVOVF9VU0VSX0lERU5USVRZX1JFVFJJRVZFRFxuICogQHBhcmFtIGFwcCBUaGUgT3JpenVydSBzZXJ2ZXIgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBBbiBleHByZXNzIG1pZGRsZXdhcmUgdGhhdCByZXRyaWV2ZXMgdGhlIGlkZW50aXR5IGluZm9ybWF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWlkZGxld2FyZShhcHA6IE9yaXp1cnUuSVNlcnZlcik6IFJlcXVlc3RIYW5kbGVyIHtcblxuXHRyZXR1cm4gYXN5bmMgZnVuY3Rpb24gcmV0cmlldmVJZGVudGl0eUluZm9ybWF0aW9uKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSB7XG5cblx0XHR0cnkge1xuXG5cdFx0XHRjb25zdCBpZGVudGl0eVVybCA9IHZhbGlkYXRlUmVxdWVzdChyZXEpO1xuXG5cdFx0XHRjb25zdCBpZGVudGl0eVJlc3BvbnNlOiBBeGlvc1Jlc3BvbnNlPFNhbGVzZm9yY2VJZGVudGl0eT4gPSBhd2FpdCBheGlvcy5nZXQoaWRlbnRpdHlVcmwsIHtcblx0XHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHRcdEF1dGhvcml6YXRpb246IHJlcS5oZWFkZXJzLmF1dGhvcml6YXRpb25cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdHNldElkZW50aXR5SW5mb3JtYXRpb24oYXBwLCByZXEsIGlkZW50aXR5UmVzcG9uc2UuZGF0YSk7XG5cblx0XHRcdG5leHQoKTtcblxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRmYWlsKGFwcCwgZXJyb3IsIHJlcSwgcmVzLCBuZXh0KTtcblx0XHR9XG5cblx0fTtcblxufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoZSByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSByZXEgVGhlIEhUVFAgcmVxdWVzdC5cbiAqIEByZXR1cm5zIFRoZSBJZGVudGl0eSBVUkwuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUmVxdWVzdChyZXE6IFJlcXVlc3QpIHtcblxuXHRleHRyYWN0QWNjZXNzVG9rZW4ocmVxKTtcblxuXHRpZiAoIXJlcS5vcml6dXJ1KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIG9iamVjdCBwYXJhbWV0ZXI6IG9yaXp1cnUuJyk7XG5cdH1cblxuXHRpZiAoIXJlcS5vcml6dXJ1LnNhbGVzZm9yY2UpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcmVxdWlyZWQgb2JqZWN0IHBhcmFtZXRlcjogb3JpenVydVtzYWxlc2ZvcmNlXS4nKTtcblx0fVxuXG5cdGNvbnN0IHNhbGVzZm9yY2UgPSByZXEub3JpenVydS5zYWxlc2ZvcmNlO1xuXHRpZiAoIXNhbGVzZm9yY2UudXNlckluZm8pIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcmVxdWlyZWQgb2JqZWN0IHBhcmFtZXRlcjogb3JpenVydVtzYWxlc2ZvcmNlXVt1c2VySW5mb10uJyk7XG5cdH1cblxuXHRjb25zdCB1c2VySW5mbyA9IHNhbGVzZm9yY2UudXNlckluZm87XG5cdGlmICghdXNlckluZm8udXJsKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXI6IG9yaXp1cnVbc2FsZXNmb3JjZV1bdXNlckluZm9dW3VybF0uJyk7XG5cdH1cblxuXHRpZiAodXNlckluZm8udmFsaWRhdGVkID09PSBmYWxzZSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignVGhlIElkZW50aXR5IFVSTCBtdXN0IGJlIHZhbGlkYXRlZC4nKTtcblx0fVxuXG5cdGlmICghdXNlckluZm8udmFsaWRhdGVkKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXI6IG9yaXp1cnVbc2FsZXNmb3JjZV1bdXNlckluZm9dW3ZhbGlkYXRlZF0uJyk7XG5cdH1cblxuXHRyZXR1cm4gdXNlckluZm8udXJsO1xuXG59XG5cbi8qKlxuICogU2V0cyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gaW4gdGhlIE9yaXp1cnUgY29udGV4dCBhbmQgZW1pdHMgYSB1c2VyIGlkZW50aXR5XG4gKiByZXRyaWV2ZWQgZXZlbnQuXG4gKlxuICogQHBhcmFtIGFwcCBUaGUgT3JpenVydSBzZXJ2ZXIgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcmVxIFRoZSBIVFRQIHJlcXVlc3QuXG4gKiBAcGFyYW0gaWRlbnRpdHkgVGhlIFNhbGVzZm9yY2UgSWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIHNldElkZW50aXR5SW5mb3JtYXRpb24oYXBwOiBPcml6dXJ1LklTZXJ2ZXIsIHJlcTogUmVxdWVzdCwgaWRlbnRpdHk6IFNhbGVzZm9yY2VJZGVudGl0eSkge1xuXG5cdHJlcS5vcml6dXJ1IS5zYWxlc2ZvcmNlIS5pZGVudGl0eSA9IGlkZW50aXR5O1xuXG5cdGFwcC5lbWl0KEVWRU5UX1VTRVJfSURFTlRJVFlfUkVUUklFVkVELCBgSWRlbnRpdHkgaW5mb3JtYXRpb24gcmV0cmlldmVkIGZvciB1c2VyICgke2lkZW50aXR5LnVzZXJuYW1lfSkgWyR7cmVxLmlwfV0uYCk7XG5cbn1cbiJdfQ==