UNPKG

mozu-node-sdk

Version:

Mozu JavaScript SDK for Node.js and Arc.js environments

124 lines (107 loc) 4.3 kB
/* eslint handle-callback-err: 0 */ 'use strict'; var constants = require('../constants'), AuthTicket = require('./auth-ticket'), scopes = constants.scopes; var TenantCache = require('../utils/tenant-cache'); // if (typeof Promise !== "function") require('when/es6-shim/Promise.browserify-es6'); function createMemoizedClientFactory(clientPath) { var c; return function () { return (c || (c = require(clientPath))).apply(this, arguments); }; } var makeAppAuthClient = createMemoizedClientFactory('../clients/platform/applications/authTicket'); var makeDeveloperAuthClient = createMemoizedClientFactory('../clients/platform/developer/developerAdminUserAuthTicket'); var makeAdminUserAuthClient = createMemoizedClientFactory('../clients/platform/adminuser/tenantAdminUserAuthTicket'); function cacheDataAndCreateAuthTicket(res) { var tenants = res.availableTenants; if (tenants) { for (var i = 0; i < tenants.length; i++) { TenantCache.add(tenants[i]); } } return new AuthTicket(res); } function getPlatformAuthTicket(client) { return makeAppAuthClient(client).authenticateApp({ applicationId: client.context.appKey, sharedSecret: client.context.sharedSecret }, { scope: scopes.NONE }).then(cacheDataAndCreateAuthTicket); } function refreshPlatformAuthTicket(client, ticket) { return makeAppAuthClient(client).refreshAppAuthTicket({ refreshToken: ticket.refreshToken }, { scope: scopes.NONE }).then(cacheDataAndCreateAuthTicket); } function getDeveloperAuthTicket(client) { return makeDeveloperAuthClient(client).createDeveloperUserAuthTicket(client.context.developerAccount, { scope: scopes.NONE }).then(cacheDataAndCreateAuthTicket); } function refreshDeveloperAuthTicket(client, ticket) { return makeDeveloperAuthClient(client).refreshDeveloperAuthTicket(ticket, { scope: scopes.NONE }).then(cacheDataAndCreateAuthTicket); } function getAdminUserAuthTicket(client) { return makeAdminUserAuthClient(client).createUserAuthTicket({ tenantId: client.context.tenant }, { body: client.context.adminUser, scope: constants.scopes.APP_ONLY }).then(function (json) { client.context.user = json.user; return cacheDataAndCreateAuthTicket(json); }); } function refreshAdminUserAuthTicket(client, ticket) { return makeAdminUserAuthClient(client).refreshAuthTicket(ticket, { scope: constants.scopes.APP_ONLY }).then(cacheDataAndCreateAuthTicket); } var calleeToClaimType = { 'addPlatformAppClaims': 'application', 'addDeveloperUserClaims': 'developer', 'addAdminUserClaims': 'admin-user' }; function makeClaimMemoizer(calleeName, requester, refresher, claimHeader) { return function (client) { var cacheAndUpdateClient = function cacheAndUpdateClient(ticket) { return new Promise(function (resolve) { client.authenticationStorage.set(calleeToClaimType[calleeName], client.context, ticket, function () { client.context[claimHeader] = ticket.accessToken; resolve(client); }); }); }; var op = new Promise(function (resolve) { client.authenticationStorage.get(calleeToClaimType[calleeName], client.context, function (err, ticket) { resolve(ticket); }); }).then(function (ticket) { if (!ticket) { return requester(client).then(cacheAndUpdateClient); } if (new Date(ticket.accessTokenExpiration) < new Date()) { return refresher(client, ticket).then(cacheAndUpdateClient); } client.context[claimHeader] = ticket.accessToken; return client; }); function setRecent() { AuthProvider.addMostRecentUserClaims = AuthProvider[calleeName]; } op.then(setRecent, setRecent); return op; }; } var AuthProvider = { addPlatformAppClaims: makeClaimMemoizer('addPlatformAppClaims', getPlatformAuthTicket, refreshPlatformAuthTicket, constants.headers.APPCLAIMS), addDeveloperUserClaims: makeClaimMemoizer('addDeveloperUserClaims', getDeveloperAuthTicket, refreshDeveloperAuthTicket, constants.headers.USERCLAIMS), addAdminUserClaims: makeClaimMemoizer('addAdminUserClaims', getAdminUserAuthTicket, refreshAdminUserAuthTicket, constants.headers.USERCLAIMS), addMostRecentUserClaims: false }; module.exports = AuthProvider;