@contentstack/cli-auth
Version:
Contentstack CLI plugin for authentication activities
107 lines (106 loc) • 6.39 kB
JavaScript
;
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'];