1
1
/// <reference path="adal-angular.d.ts" />
2
2
3
3
import { Injectable } from '@angular/core' ;
4
- import { Observable , bindCallback } from 'rxjs' ;
4
+
5
+ import { Observable , bindCallback , timer } from 'rxjs' ;
5
6
import { map } from 'rxjs/operators' ;
7
+
6
8
import * as lib from 'adal-angular' ;
7
9
8
10
@Injectable ( )
9
11
export class AdalService {
10
12
11
- private context : adal . AuthenticationContext = null as any ;
13
+
14
+ private context : adal . AuthenticationContext = < any > null ;
15
+ private loginRefreshTimer = < any > null ;
16
+
12
17
13
18
private user : adal . User = {
14
19
authenticated : false ,
15
20
userName : '' ,
16
21
error : '' ,
17
22
token : '' ,
18
- profile : { }
23
+ profile : { } ,
24
+ loginCached : false
19
25
} ;
20
26
21
27
constructor ( ) { }
@@ -42,7 +48,19 @@ export class AdalService {
42
48
window . AuthenticationContext = this . context . constructor ;
43
49
44
50
// loginresource is used to set authenticated status
45
- this . updateDataFromCache ( this . context . config . loginResource as string ) ;
51
+
52
+ this . updateDataFromCache ( ) ;
53
+
54
+ if ( this . user . loginCached && ! this . user . authenticated && window . self == window . top ) {
55
+ this . refreshLoginToken ( ) ;
56
+ } else if ( this . user . loginCached && this . user . authenticated && ! this . loginRefreshTimer && window . self == window . top ) {
57
+ // Get expiration of login token
58
+ let exp = this . context . _getItem ( this . context . CONSTANTS . STORAGE . EXPIRATION_KEY + < any > this . context . config . loginResource ) ;
59
+ this . loginRefreshTimer = timer ( exp - this . now ( ) - 300 ) . subscribe ( ( x ) => {
60
+ this . refreshLoginToken ( )
61
+ } ) ;
62
+ }
63
+
46
64
}
47
65
48
66
public get config ( ) : adal . Config {
@@ -71,8 +89,7 @@ export class AdalService {
71
89
const requestInfo = this . context . getRequestInfo ( hash ) ;
72
90
this . context . saveTokenFromHash ( requestInfo ) ;
73
91
if ( requestInfo . requestType === this . context . REQUEST_TYPE . LOGIN ) {
74
- this . updateDataFromCache ( this . context . config . loginResource as string ) ;
75
-
92
+ this . updateDataFromCache ( ) ;
76
93
} else if ( requestInfo . requestType === this . context . REQUEST_TYPE . RENEW_TOKEN ) {
77
94
this . context . callback = window . parent . callBackMappedToRenewStates [ requestInfo . stateResponse ] ;
78
95
}
@@ -165,24 +182,56 @@ export class AdalService {
165
182
return this . context . getResourceForEndpoint ( url ) ;
166
183
}
167
184
168
- public refreshDataFromCache ( ) : void {
169
- this . updateDataFromCache ( this . context . config . loginResource as string ) ;
185
+
186
+ public refreshDataFromCache ( ) {
187
+ this . updateDataFromCache ( ) ;
188
+
170
189
}
171
190
172
- private updateDataFromCache ( resource : string ) : void {
173
- const token = this . context . getCachedToken ( resource ) ;
191
+ private updateDataFromCache ( ) : void {
192
+ const token = this . context . getCachedToken ( < any > this . context . config . loginResource ) ;
174
193
this . user . authenticated = token !== null && token . length > 0 ;
175
- const user = this . context . getCachedUser ( ) || { userName : '' , profile : undefined } ;
194
+
195
+ const user = this . context . getCachedUser ( ) ;
196
+
176
197
if ( user ) {
177
198
this . user . userName = user . userName ;
178
199
this . user . profile = user . profile ;
179
200
this . user . token = token ;
180
201
this . user . error = this . context . getLoginError ( ) ;
202
+ this . user . loginCached = true ;
181
203
} else {
182
204
this . user . userName = '' ;
183
205
this . user . profile = { } ;
184
206
this . user . token = '' ;
185
- this . user . error = '' ;
207
+ this . user . error = this . context . getLoginError ( ) ;
208
+ this . user . loginCached = false ;
186
209
}
187
210
}
211
+
212
+ private refreshLoginToken ( ) : void {
213
+ if ( ! this . user . loginCached ) throw ( "User not logged in" ) ;
214
+ this . acquireToken ( < any > this . context . config . loginResource ) . subscribe ( ( token : string ) => {
215
+ this . user . token = token ;
216
+ if ( this . user . authenticated == false ) {
217
+ this . user . authenticated = true ;
218
+ this . user . error = '' ;
219
+ window . location . reload ( ) ;
220
+ } else {
221
+ // Get expiration of login token
222
+ let exp = this . context . _getItem ( this . context . CONSTANTS . STORAGE . EXPIRATION_KEY + < any > this . context . config . loginResource ) ;
223
+ if ( this . loginRefreshTimer ) this . loginRefreshTimer . unsubscribe ( ) ;
224
+ this . loginRefreshTimer = timer ( exp - this . now ( ) - 300 ) . subscribe ( ( x ) => {
225
+ this . refreshLoginToken ( )
226
+ } ) ;
227
+ }
228
+ } , ( error : string ) => {
229
+ this . user . authenticated = false ;
230
+ this . user . error = this . context . getLoginError ( ) ;
231
+ } ) ;
232
+ }
233
+
234
+ private now ( ) : number {
235
+ return Math . round ( new Date ( ) . getTime ( ) / 1000.0 ) ;
236
+ } ;
188
237
}
0 commit comments