@controlplane/cli
Version:
Control Plane Corporation CLI
128 lines • 5.62 kB
JavaScript
;
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