@financialforcedev/orizuru-auth
Version:
Salesforce authentication for Heroku Node applications.
108 lines • 13.2 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 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==