11import * as Msal from "@azure/msal-browser" ;
2- import { Utils } from "../utils" ;
32import { IAuthenticator , AccessToken } from "." ;
43
54
65const aadClientId = "a962e1ed-5694-4abe-9e9b-d08d35877efc" ; // test app
7- const scopes = [ " https://management.azure.com/user_impersonation"] ;
8- const loginRequest = { scopes : [ "openid" , "profile" , " https://management.azure .com/user_impersonation" ] } ;
9-
6+ const loginRequest = { scopes : [ "openid" , "profile" , " https://management.azure.com/user_impersonation"] , account : null } ;
7+ const authority = " https://login.microsoftonline .com/common" ;
8+ const redirectUri = "https://apimanagement-cors-proxy-df.azure-api.net/portal/signin-aad" ;
109
1110export class ArmAuthenticator implements IAuthenticator {
1211 private accessToken : AccessToken ;
1312 private msalInstance : Msal . PublicClientApplication ;
13+ private authPromise : Promise < AccessToken > ;
1414
1515 constructor ( ) {
1616 const msalConfig : Msal . Configuration = {
1717 auth : {
1818 clientId : aadClientId ,
19- authority : "https://login.microsoftonline.com/common" ,
20- redirectUri : "https://apimanagement-cors-proxy-df.azure-api.net/portal/signin-aad" ,
19+ authority : authority ,
20+ redirectUri : redirectUri
2121 } ,
2222 cache : {
2323 cacheLocation : "sessionStorage" , // This configures where your cache will be stored
@@ -26,55 +26,18 @@ export class ArmAuthenticator implements IAuthenticator {
2626 } ;
2727
2828 this . msalInstance = new Msal . PublicClientApplication ( msalConfig ) ;
29- this . checkCallbacks ( ) ;
3029 }
3130
32- public async checkCallbacks ( ) : Promise < void > {
31+ public async checkCallbacks ( ) : Promise < Msal . AuthenticationResult > {
3332 try {
34- const response = await this . msalInstance . handleRedirectPromise ( ) ;
35-
36- debugger ;
3733
38- if ( response !== null ) {
39- // sessionStorage[tokenKey] = response.idToken;
40- // this.onLogin.next(true);
41-
42- // this.checkToken();
43- }
34+ return await this . msalInstance . handleRedirectPromise ( ) ;
4435 }
4536 catch ( error ) {
4637 console . error ( error ) ;
4738 }
4839 }
4940
50-
51-
52- private async getTokenRedirect ( request ) : Promise < Msal . AuthenticationResult > {
53- const account = this . getAccount ( ) ;
54-
55- if ( ! account ) {
56- await this . msalInstance . acquireTokenRedirect ( request ) ;
57- return ;
58- }
59-
60- request . account = account ;
61-
62- try {
63- return await this . msalInstance . acquireTokenSilent ( request ) ;
64- }
65- catch ( error ) {
66- console . warn ( "silent token acquisition fails. acquiring token using redirect" ) ;
67-
68- if ( error instanceof Msal . InteractionRequiredAuthError ) {
69- // fallback to interaction when silent call fails
70- await this . msalInstance . acquireTokenRedirect ( request ) ;
71- }
72- else {
73- console . warn ( error ) ;
74- }
75- }
76- }
77-
7841 private getAccount ( ) : Msal . AccountInfo {
7942 const accounts = this . msalInstance . getAllAccounts ( ) ;
8043
@@ -85,75 +48,59 @@ export class ArmAuthenticator implements IAuthenticator {
8548 return accounts [ 0 ] ;
8649 }
8750
88- private async tryAcquireToken ( request : any ) : Promise < any > {
51+ private async tryAcquireToken ( ) : Promise < AccessToken > {
8952 const account = this . getAccount ( ) ;
9053
9154 if ( ! account ) {
92- await this . msalInstance . acquireTokenRedirect ( request ) ;
55+ const callbackResult = await this . checkCallbacks ( ) ;
56+
57+ if ( callbackResult ) {
58+ const parsedToken = AccessToken . parse ( `${ callbackResult . tokenType } ${ callbackResult . accessToken } ` ) ;
59+ return parsedToken ;
60+ }
61+
62+ await this . msalInstance . acquireTokenRedirect ( loginRequest ) ;
9363 return ;
9464 }
9565
96- request . account = account ;
66+ loginRequest . account = account ;
9767
9868 try {
99- const result = await this . msalInstance . acquireTokenSilent ( request ) ;
100- debugger ;
69+ const result = await this . msalInstance . acquireTokenSilent ( loginRequest ) ;
70+ const token = AccessToken . parse ( `${ result . tokenType } ${ result . accessToken } ` ) ;
71+
72+ return token ;
10173 }
10274 catch ( error ) {
103- console . warn ( "silent token acquisition fails. acquiring token using redirect" ) ;
104-
10575 if ( error instanceof Msal . InteractionRequiredAuthError ) {
10676 // fallback to interaction when silent call fails
107- await this . msalInstance . acquireTokenRedirect ( request ) ;
77+ await this . msalInstance . acquireTokenRedirect ( loginRequest ) ;
10878 }
10979 else {
11080 console . warn ( error ) ;
11181 }
11282 }
11383
114-
115- console . log ( "2" ) ;
116- // await Utils.delay(1);
117-
118- // if (!response.accessToken) {
119- // throw new Error(`Unable to acquire ARM token.`);
120- // }
121-
122- // const accessToken = AccessToken.parse(`Bearer ${response.accessToken}`);
123- // this.setAccessToken(accessToken);
124-
125-
126-
127- // setTimeout(this.tryAcquireToken.bind(this), 30 * 60 * 1000); // scheduling token refresh in 30 min
128-
129- // return accessToken;
130-
131-
13284 return null ;
13385 }
13486
135- public async getAccessToken ( ) : Promise < AccessToken > {
136- if ( this . accessToken && ! this . accessToken . isExpired ( ) ) {
137- return this . accessToken ;
138- }
139-
140- const storedAccessToken = sessionStorage . getItem ( "armAccessToken" ) ;
141-
142- if ( storedAccessToken ) {
143- const parsedToken = AccessToken . parse ( storedAccessToken ) ;
87+ private async startGettingToken ( ) : Promise < AccessToken > {
88+ const accessToken = await this . tryAcquireToken ( ) ;
89+ return accessToken ;
90+ }
14491
145- if ( ! parsedToken . isExpired ( ) ) {
146- return parsedToken ;
147- }
92+ public getAccessToken ( ) : Promise < AccessToken > {
93+ if ( this . authPromise ) {
94+ return this . authPromise ;
14895 }
14996
150- const accessToken = await this . tryAcquireToken ( loginRequest ) ;
151- return accessToken ;
97+ this . authPromise = this . startGettingToken ( ) ;
98+ return this . authPromise ;
15299 }
153100
154101 public async getAccessTokenAsString ( ) : Promise < string > {
155102 const accessToken = await this . getAccessToken ( ) ;
156- return accessToken . toString ( ) ;
103+ return accessToken ? .toString ( ) ;
157104 }
158105
159106 public async setAccessToken ( accessToken : AccessToken ) : Promise < void > {
0 commit comments