in common/lib/authentication/iam_authentication_plugin.ts [65:134]
private async connectInternal(
hostInfo: HostInfo,
props: Map<string, any>,
isInitialConnection: boolean,
connectFunc: () => Promise<ClientWrapper>
): Promise<ClientWrapper> {
const user = WrapperProperties.USER.get(props);
if (!user) {
throw new AwsWrapperError(`${WrapperProperties.USER} is null or empty`);
}
const host = IamAuthUtils.getIamHost(props, hostInfo);
const region: string = RegionUtils.getRegion(props.get(WrapperProperties.IAM_REGION.name), host);
const port = IamAuthUtils.getIamPort(props, hostInfo, this.pluginService.getCurrentClient().defaultPort);
const tokenExpirationSec = WrapperProperties.IAM_TOKEN_EXPIRATION.get(props);
if (tokenExpirationSec < 0) {
throw new AwsWrapperError(Messages.get("AuthenticationToken.tokenExpirationLessThanZero"));
}
const cacheKey: string = IamAuthUtils.getCacheKey(port, user, host, region);
const tokenInfo = IamAuthenticationPlugin.tokenCache.get(cacheKey);
const isCachedToken: boolean = tokenInfo !== undefined && !tokenInfo.isExpired();
if (isCachedToken && tokenInfo) {
logger.debug(Messages.get("AuthenticationToken.useCachedToken", tokenInfo.token));
WrapperProperties.PASSWORD.set(props, tokenInfo.token);
} else {
const tokenExpiry: number = Date.now() + tokenExpirationSec * 1000;
const token = await IamAuthUtils.generateAuthenticationToken(
host,
port,
region,
user,
AwsCredentialsManager.getProvider(hostInfo, props),
this.pluginService
);
this.fetchTokenCounter.inc();
logger.debug(Messages.get("AuthenticationToken.generatedNewToken", token));
WrapperProperties.PASSWORD.set(props, token);
IamAuthenticationPlugin.tokenCache.set(cacheKey, new TokenInfo(token, tokenExpiry));
}
this.pluginService.updateConfigWithProperties(props);
try {
return await connectFunc();
} catch (e) {
logger.debug(Messages.get("Authentication.connectError", (e as Error).message));
if (!this.pluginService.isLoginError(e as Error) || !isCachedToken) {
throw e;
}
// Login unsuccessful with cached token
// Try to generate a new token and try to connect again
const tokenExpiry: number = Date.now() + tokenExpirationSec * 1000;
const token = await IamAuthUtils.generateAuthenticationToken(
host,
port,
region,
user,
AwsCredentialsManager.getProvider(hostInfo, props),
this.pluginService
);
this.fetchTokenCounter.inc();
logger.debug(Messages.get("AuthenticationToken.generatedNewToken", token));
WrapperProperties.PASSWORD.set(props, token);
IamAuthenticationPlugin.tokenCache.set(cacheKey, new TokenInfo(token, tokenExpiry));
return connectFunc();
}
}