mozu-node-sdk
Version:
Mozu JavaScript SDK for Node.js and Arc.js environments
124 lines (107 loc) • 4.3 kB
JavaScript
/* eslint handle-callback-err: 0 */
;
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;