UNPKG

stsbroker

Version:

CLI to configure and interact with your own AWS STS Broker.

99 lines (98 loc) 3.83 kB
"use strict"; 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;