UNPKG

@contentstack/cli-auth

Version:

Contentstack CLI plugin for authentication activities

107 lines (106 loc) 6.39 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const cli_utilities_1 = require("@contentstack/cli-utilities"); const utils_1 = require("../../utils"); const base_command_1 = require("../../base-command"); class LoginCommand extends base_command_1.BaseCommand { async run() { cli_utilities_1.log.debug('LoginCommand run method started', this.contextDetails); try { cli_utilities_1.log.debug('Initializing management API client', this.contextDetails); const managementAPIClient = await (0, cli_utilities_1.managementSDKClient)({ host: this.cmaHost, skipTokenValidity: true }); cli_utilities_1.log.debug('Management API client initialized successfully', this.contextDetails); const { flags: loginFlags } = await this.parse(LoginCommand); cli_utilities_1.log.debug('Token add flags parsed', Object.assign(Object.assign({}, this.contextDetails), { flags: loginFlags })); utils_1.authHandler.client = managementAPIClient; cli_utilities_1.log.debug('Auth handler client set', this.contextDetails); const oauth = loginFlags === null || loginFlags === void 0 ? void 0 : loginFlags.oauth; cli_utilities_1.log.debug(`Authentication method: ${oauth ? 'OAuth' : 'Basic'}`, this.contextDetails); if (oauth === true) { cli_utilities_1.log.debug('Starting OAuth authentication flow', this.contextDetails); cli_utilities_1.authHandler.host = this.cmaHost; await cli_utilities_1.authHandler.oauth(); cli_utilities_1.log.debug('OAuth authentication completed', this.contextDetails); } else { cli_utilities_1.log.debug('Starting basic authentication flow', this.contextDetails); const username = (loginFlags === null || loginFlags === void 0 ? void 0 : loginFlags.username) || (await utils_1.interactive.askUsername()); const password = (loginFlags === null || loginFlags === void 0 ? void 0 : loginFlags.password) || (await utils_1.interactive.askPassword()); cli_utilities_1.log.debug('Credentials obtained', Object.assign(Object.assign({}, this.contextDetails), { hasUsername: !!username, hasPassword: !!password })); await this.login(username, password); } } catch (error) { cli_utilities_1.log.debug('Login command failed', Object.assign(Object.assign({}, this.contextDetails), { error })); if (((error === null || error === void 0 ? void 0 : error.message) && (error === null || error === void 0 ? void 0 : error.message.includes('2FA'))) || (error === null || error === void 0 ? void 0 : error.message.includes('MFA'))) { error.message = `${error.message}\nFor more information about MFA, visit: https://www.contentstack.com/docs/developers/security/multi-factor-authentication`; } (0, cli_utilities_1.handleAndLogError)(error, Object.assign({}, this.contextDetails)); process.exit(); } } async login(username, password) { cli_utilities_1.log.debug('Starting login process', Object.assign(Object.assign({}, this.contextDetails), { username })); try { cli_utilities_1.log.debug('Calling auth handler login', this.contextDetails); let tfaToken; try { tfaToken = await utils_1.mfaHandler.getMFACode(); if (tfaToken) { cli_utilities_1.log.debug('MFA token generated from stored configuration', this.contextDetails); } } catch (error) { cli_utilities_1.log.debug('Failed to generate MFA token from config', Object.assign(Object.assign({}, this.contextDetails), { error })); tfaToken = undefined; } const user = await utils_1.authHandler.login(username, password, tfaToken); cli_utilities_1.log.debug('Auth handler login completed', Object.assign(Object.assign({}, this.contextDetails), { hasUser: !!user, hasAuthToken: !!(user === null || user === void 0 ? void 0 : user.authtoken), userEmail: user === null || user === void 0 ? void 0 : user.email })); if (typeof user !== 'object' || !user.authtoken || !user.email) { cli_utilities_1.log.debug('Login failed - invalid user response', Object.assign(Object.assign({}, this.contextDetails), { user })); throw new cli_utilities_1.CLIError('Failed to login - invalid response'); } cli_utilities_1.log.debug('Setting config data for basic auth', this.contextDetails); await cli_utilities_1.authHandler.setConfigData('basicAuth', user); cli_utilities_1.log.debug('Config data set successfully', this.contextDetails); cli_utilities_1.log.success(cli_utilities_1.messageHandler.parse('CLI_AUTH_LOGIN_SUCCESS'), this.contextDetails); cli_utilities_1.log.debug('Login process completed successfully', this.contextDetails); } catch (error) { cli_utilities_1.log.debug('Login process failed', Object.assign(Object.assign({}, this.contextDetails), { error })); throw error; } } } exports.default = LoginCommand; LoginCommand.description = 'User sessions login'; LoginCommand.examples = [ '$ csdx auth:login', '$ csdx auth:login -u <username>', '$ csdx auth:login -u <username> -p <password>', '$ csdx auth:login --username <username>', '$ csdx auth:login --username <username> --password <password>', ]; LoginCommand.flags = { username: cli_utilities_1.flags.string({ char: 'u', description: 'Email address of your Contentstack account.', multiple: false, required: false, exclusive: ['oauth'], }), password: cli_utilities_1.flags.string({ char: 'p', description: 'Password of your Contentstack app.', multiple: false, required: false, exclusive: ['oauth'], }), oauth: cli_utilities_1.flags.boolean({ description: 'Enables single sign-on (SSO) in Contentstack CLI.', required: false, default: false, exclusive: ['username', 'password'], }), }; LoginCommand.aliases = ['login'];