src/services/AuthenticatorService.ts (54 lines of code) (raw):
import path = require('path');
import { FetchCallType, ContentTypeMap, TokenScope } from "../models/UtilModels";
import { jwtDecode, JwtPayload } from "jwt-decode";
import { IHeaders } from "typed-rest-client/Interfaces";
import { TaskParameters } from "../models/TaskParameters";
import * as AzCliUtility from '../Utils/AzCliUtility';
export class AuthenticatorService {
public taskParameters: TaskParameters;
private dataPlanetoken : string = '';
private controlPlaneToken : string = '';
constructor(taskParameters: TaskParameters) {
this.taskParameters = taskParameters;
}
public async getDataPlaneHeader(apicallType : FetchCallType) : Promise<IHeaders> {
if(!this.isTokenValid(TokenScope.Dataplane)) {
let tokenRes:any = await this.getTokenAPI(TokenScope.Dataplane);
this.dataPlanetoken = tokenRes;
}
let headers: IHeaders = {
'content-type': ContentTypeMap[apicallType] ?? 'application/json',
'Authorization': 'Bearer '+ this.dataPlanetoken
};
return headers;
}
public async getARMTokenHeader() {
// right now only get calls from the GH, so no need of content type for now for the get calls.
var tokenRes:any = await this.getTokenAPI(TokenScope.ControlPlane);
this.controlPlaneToken = tokenRes;
let headers: IHeaders = {
'Authorization': 'Bearer '+ this.controlPlaneToken,
};
return headers;
}
private async getTokenAPI(scope: TokenScope)
{
let tokenScopeDecoded = scope == TokenScope.Dataplane ? this.taskParameters.dataPlaneTokenScope : this.taskParameters.armTokenScope;
try {
const cmdArguments = ["account", "get-access-token", "--resource"];
cmdArguments.push(tokenScopeDecoded);
let result: any = await AzCliUtility.execAz(cmdArguments);
let token = result.accessToken;
scope == TokenScope.ControlPlane ? this.controlPlaneToken = token : this.dataPlanetoken = token;
return token;
}
catch (err:any) {
const message =
`An error occurred while getting credentials from ` + `Azure CLI: ${err.message}`;
throw new Error(message);
}
}
private isTokenValid(scope: TokenScope) {
let token = scope == TokenScope.Dataplane ? this.dataPlanetoken : this.controlPlaneToken;
try {
let header = token && jwtDecode<JwtPayload>(token);
const now = Math.floor(Date.now() / 1000)
return (header && header?.exp && header.exp + 2 > now);
}
catch(error:any) {
console.log("Error in getting the token");
}
}
}