stsbroker
Version:
CLI to configure and interact with your own AWS STS Broker.
99 lines (98 loc) • 3.83 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const amazon_cognito_identity_js_1 = require("amazon-cognito-identity-js");
const fs = require("fs");
const express = require("express");
const expressWs = require("express-ws");
const opn = require("opn");
const storage = require("node-persist");
const pathToJs = __filename.split("/");
pathToJs.splice(-3, 3);
const TokenStorage = {
get: async (poolData) => {
return await storage.getItem(`${poolData.UserPoolId}.${poolData.ClientId}`);
},
add: async (poolData, tokens) => {
return await storage.setItem(`${poolData.UserPoolId}.${poolData.ClientId}`, JSON.stringify(tokens));
}
};
const GetTokenAuthFlow = (setup) => new Promise(resolve => {
const config = fs.readFileSync(setup.hostedUI).toString();
const poolData = {
UserPoolId: JSON.parse(config).userPoolId,
ClientId: JSON.parse(config).userPoolWebClientId
};
const app = express();
expressWs(app);
app.use(express.static(pathToJs.join("/") + "/hostedui/dist"));
app.get("/", (req, res) => res.send(`<!DOCTYPE html><html><head><script>var amplifyCognitoConfig = ${config};var socket = "ws://localhost:3000";</script></head><body><div id="app"></div><script src="./cognitohosteduilauncher.js"></script></body></html>`));
app.ws("/", function (ws) {
ws.on("message", function (msg) {
const idToken = JSON.parse(msg).idToken;
const refreshToken = JSON.parse(msg).refreshToken;
const idTokenTTI = +new Date() + 1800000; // TODO: use jwtDecode(token).exp
const username = JSON.parse(msg).username;
TokenStorage.add(poolData, {
idToken,
idTokenTTI,
refreshToken,
username
}).then(() => {
resolve(idToken);
});
});
});
app.listen(3000);
opn("http://localhost:3000");
});
const RefreshToken = (token) => ({
token,
getToken: () => token
});
const GetTokenFromPersistedCredentials = (data, poolData) => new Promise((resolve, reject) => {
const tokens = JSON.parse(data);
const now = +new Date();
const userPool = new amazon_cognito_identity_js_1.CognitoUserPool(poolData);
const userData = {
Username: tokens.username,
Pool: userPool
};
const cognitoUser = new amazon_cognito_identity_js_1.CognitoUser(userData);
if (now > tokens.idTokenTTI) {
cognitoUser.refreshSession(RefreshToken(tokens.refreshToken), (err, result) => {
if (err) {
reject("Error");
}
else {
const idToken = result.idToken.jwtToken;
const refreshToken = result.refreshToken.token;
const idTokenTTI = +new Date() + 1800000; //now + 1/2 hour
TokenStorage.add(poolData, {
idToken,
idTokenTTI,
refreshToken,
username: tokens.username
}).then(() => {
resolve(idToken);
});
}
});
}
else {
resolve(tokens.idToken);
}
});
const getTokenFromHostedUI = async (data) => {
const config = fs.readFileSync(data.hostedUI).toString();
const poolData = {
UserPoolId: JSON.parse(config).userPoolId,
ClientId: JSON.parse(config).userPoolWebClientId
};
await storage.init({ dir: data.storage ? data.storage : "/var/tmp" });
return !data.reset
? TokenStorage.get(poolData)
.then((data) => GetTokenFromPersistedCredentials(data, poolData))
.catch(async () => GetTokenAuthFlow(data))
: GetTokenAuthFlow(data);
};
exports.getTokenFromHostedUI = getTokenFromHostedUI;