alks
Version:
CLI for working with ALKS
59 lines (50 loc) • 1.68 kB
text/typescript
import clc from 'cli-color';
import open from 'open';
import { getAlks, Props as AlksProps } from './getAlks';
import { getPasswordFromPrompt } from './getPasswordFromPrompt';
import { log } from './log';
import { getServer } from './state/server';
export async function promptForToken() {
// Only pull up the token page if a token wasn't piped through STDIN
if (process.stdin.isTTY) {
const server = await getServer();
if (!server) {
throw new Error(
'Server URL is not configured. Please run: alks developer configure'
);
}
console.error('Opening ALKS 2FA Page...');
const url = server.replace(/rest/, 'token-management');
console.error(
`If the 2FA page does not open, please visit ${clc.underline(url)}`
);
try {
await Promise.race([
open(url, {
newInstance: true,
}),
new Promise((_, rej) => {
setTimeout(() => rej(), 5000);
}), // timeout after 5 seconds
]);
} catch (err) {
console.error(`Failed to open ${url}: ${err}`);
console.error('Please open the url in the browser of your choice');
}
console.error('Please copy your refresh token from ALKS and paste below..');
}
const refreshToken = await getPasswordFromPrompt('Refresh Token');
log('exchanging refresh token for access token');
const alks = await getAlks({} as AlksProps);
try {
await alks.getAccessToken({
refreshToken,
});
} catch (err) {
const e = err as Error;
e.message = 'Error validating refresh token. ' + e.message;
throw err;
}
console.error(clc.white('Refresh token validated!'));
return refreshToken;
}