@@ -4,20 +4,44 @@ import { IAuthenticator, AccessToken } from "./../authentication";
44export class DefaultAuthenticator implements IAuthenticator {
55 constructor ( private readonly eventManager : EventManager ) { }
66
7- public async getAccessToken ( ) : Promise < string > {
8- const accessToken = sessionStorage . getItem ( "accessToken" ) ;
9-
10- if ( ! accessToken && window . location . pathname . startsWith ( "/signin-sso" ) ) {
7+ private runSsoFlow ( ) : Promise < void > {
8+ return new Promise < void > ( async ( ) => {
119 const url = new URL ( location . href ) ;
1210 const queryParams = new URLSearchParams ( url . search ) ;
1311 const tokenValue = queryParams . get ( "token" ) ;
14- const token = AccessToken . parse ( `SharedAccessSignature ${ tokenValue } ` ) ;
12+ const tokenString = `SharedAccessSignature ${ tokenValue } ` ;
13+ const token = AccessToken . parse ( tokenString ) ;
14+
1515 await this . setAccessToken ( token ) ;
1616
1717 const returnUrl = queryParams . get ( "returnUrl" ) || "/" ;
18+
19+ // wait for redirect to happen, deliberatly not resolving the promise
1820 window . location . assign ( returnUrl ) ;
21+ } ) ;
22+ }
23+
24+ public async getAccessToken ( ) : Promise < AccessToken > {
25+ if ( location . pathname . startsWith ( "/signin-sso" ) ) {
26+ await this . runSsoFlow ( ) ;
27+ }
28+
29+ const storedToken = sessionStorage . getItem ( "accessToken" ) ;
30+
31+ if ( storedToken ) {
32+ const accessToken = AccessToken . parse ( storedToken ) ;
33+
34+ if ( ! accessToken . isExpired ( ) ) {
35+ return accessToken ;
36+ }
1937 }
20- return accessToken ;
38+
39+ return null ;
40+ }
41+
42+ public async getAccessTokenAsString ( ) : Promise < string > {
43+ const accessToken = await this . getAccessToken ( ) ;
44+ return accessToken ?. toString ( ) ;
2145 }
2246
2347 public async setAccessToken ( accessToken : AccessToken ) : Promise < void > {
@@ -27,27 +51,14 @@ export class DefaultAuthenticator implements IAuthenticator {
2751 }
2852
2953 sessionStorage . setItem ( "accessToken" , accessToken . toString ( ) ) ;
30-
31- const expiresInMs = accessToken . expiresInMs ( ) ;
32- const refreshBufferMs = 5 * 60 * 1000 ; // 5 min
33- const nextRefreshInMs = expiresInMs - refreshBufferMs ;
34-
35- if ( expiresInMs < refreshBufferMs ) {
36- // Refresh immediately
37- this . eventManager . dispatchEvent ( "authenticated" ) ;
38- }
39- else {
40- // Schedule refresh 5 min before expiration.
41- setTimeout ( ( ) => this . eventManager . dispatchEvent ( "authenticated" ) , nextRefreshInMs ) ;
42- }
4354 }
4455
4556 public clearAccessToken ( ) : void {
4657 sessionStorage . removeItem ( "accessToken" ) ;
4758 }
4859
4960 public async isAuthenticated ( ) : Promise < boolean > {
50- const accessToken = await this . getAccessToken ( ) ;
61+ const accessToken = await this . getAccessTokenAsString ( ) ;
5162
5263 if ( ! accessToken ) {
5364 return false ;
0 commit comments