UNPKG

@controlplane/cli

Version:

Control Plane Corporation CLI

128 lines 5.62 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.doInteractiveLogin = void 0; const axios = require("axios"); const express = require("express"); const http = require("http"); const jwt = require("jwt-decode"); const open = require("open"); const path = require("path"); const util_1 = require("util"); const logger_1 = require("../util/logger"); async function startHttpServer(handler, endpoint) { let app = express(); app.use(express.json()); app.use(express.static(path.join(__dirname, '../../public'))); return new Promise((resolve, reject) => { let srv = http.createServer(app); const port = 48794; try { srv.listen(port, () => { const server = { port: port, stop: () => { return (0, util_1.promisify)(srv.close).apply(srv); }, }; // called by frontend to check if the token has the claims app.post('/touchbase', async (req, res) => { logger_1.logger.debug('Login server - touchbase'); try { const url = endpoint + '/user'; await axios.default.post(url, undefined, { headers: { Authorization: req.body.idToken, }, }); logger_1.logger.debug('Login server - touchbase - success'); res.json({ message: 'ok' }); } catch (e) { res.status(500); logger_1.logger.debug('Login server - touchbase - failure - ' + e.message); res.json({ message: 'error', error: e }); } }); app.get('/auth/details/:email', async (req, res) => { logger_1.logger.debug('Login server - details'); try { const { email } = req.params; const detailsRes = await axios.default.get(`${endpoint}/auth/details/${email}`); const { provider } = detailsRes.data; logger_1.logger.debug('Login server - details - success'); res.json({ message: 'ok', provider }); } catch (e) { res.status(500); logger_1.logger.debug('Login server - details - failure - ' + e.message); res.json({ message: 'error', error: e }); } }); // called after the firebase login and touchbase check, either with error if firebase login or toucbase failed, or with tokens if firebase login and touchbase succeeds app.post('/stop', async (req, res) => { logger_1.logger.debug('Login server - stop'); const t = req.body.tokens; const e = req.body.error; try { await handler(e, t, server); logger_1.logger.debug('Login server - stop - success'); res.json({ message: 'ok' }); } catch (e) { // just in case res.status(500); logger_1.logger.debug('Login server - stop - failure - ' + e.message); res.json({ message: 'error', error: e }); } }); resolve(server); }); } catch (e) { reject(e); } }); } async function doInteractiveLogin(profile) { const discoveryRes = await axios.default.get(profile.request.endpoint + '/discovery'); const firebase = discoveryRes.data.firebase; return new Promise(async (resolve, reject) => { const handler = async (error, tokens, server) => { logger_1.logger.debug('Login server - handler'); if (error) { // remove old tokens and email if the new login try fails profile.authInfo = { accessToken: '', refreshToken: '', email: '', }; server.stop(); reject(); } else { const parsed = jwt(tokens.idToken); // update profile profile.authInfo = { accessToken: tokens.idToken, refreshToken: tokens.refreshToken, email: parsed.email, }; server.stop(); // return to caller of doLogin() resolve(); } }; const server = await startHttpServer(handler, profile.request.endpoint); const url = `http://localhost:${server.port}/?apiKey=${firebase.apiKey}&profile=${profile.name}&authDomain=${firebase.authDomain}&projectId=${firebase.projectId}`; console.error(`cpln has opened your browser at ${url} Complete the login there or type Ctrl+C at any time to abort. If your browser fails to open a popup for login, please allow the host 'http://localhost:${server.port}' in your browser settings.`); open(url, { wait: false, }); return undefined; }); } exports.doInteractiveLogin = doInteractiveLogin; //# sourceMappingURL=login.js.map