@@ -9,12 +9,14 @@ import { UserManagerEvents } from './UserManagerEvents';
99import { SilentRenewService } from './SilentRenewService' ;
1010import { SessionMonitor } from './SessionMonitor' ;
1111import { TokenRevocationClient } from './TokenRevocationClient' ;
12+ import { TokenClient } from './TokenClient' ;
1213
1314export class UserManager extends OidcClient {
1415 constructor ( settings = { } ,
1516 SilentRenewServiceCtor = SilentRenewService ,
1617 SessionMonitorCtor = SessionMonitor ,
17- TokenRevocationClientCtor = TokenRevocationClient
18+ TokenRevocationClientCtor = TokenRevocationClient ,
19+ TokenClientCtor = TokenClient
1820 ) {
1921
2022 if ( ! ( settings instanceof UserManagerSettings ) ) {
@@ -37,6 +39,7 @@ export class UserManager extends OidcClient {
3739 }
3840
3941 this . _tokenRevocationClient = new TokenRevocationClientCtor ( this . _settings ) ;
42+ this . _tokenClient = new TokenClientCtor ( this . _settings ) ;
4043 }
4144
4245 get _redirectNavigator ( ) {
@@ -144,6 +147,51 @@ export class UserManager extends OidcClient {
144147 }
145148
146149 signinSilent ( args = { } ) {
150+ // first determine if we have a refresh token, or need to use iframe
151+ return this . _loadUser ( ) . then ( user => {
152+ if ( user && user . refresh_token ) {
153+ args . refresh_token = user . refresh_token ;
154+ return this . _useRefreshToken ( args ) ;
155+ }
156+ else {
157+ args . id_token_hint = args . id_token_hint || ( this . settings . includeIdTokenInSilentRenew && user . id_token ) ;
158+ return this . _signinSilentIframe ( args ) ;
159+ }
160+ } ) ;
161+ }
162+
163+ _useRefreshToken ( args = { } ) {
164+ return this . _tokenClient . exchangeRefreshToken ( args ) . then ( result => {
165+ if ( ! result ) {
166+ Log . error ( "UserManager._useRefreshToken: No response returned from token endpoint" ) ;
167+ return Promise . reject ( "No response returned from token endpoint" ) ;
168+ }
169+ if ( ! result . access_token ) {
170+ Log . error ( "UserManager._useRefreshToken: No access token returned from token endpoint" ) ;
171+ return Promise . reject ( "No access token returned from token endpoint" ) ;
172+ }
173+
174+ Log . debug ( "UserManager._useRefreshToken: refresh token response success" ) ;
175+
176+ return this . _loadUser ( ) . then ( user => {
177+ if ( user ) {
178+ user . access_token = result . access_token ;
179+ user . refresh_token = result . refresh_token || user . refresh_token ;
180+ user . expires_in = result . expires_in ;
181+
182+ return this . storeUser ( user ) . then ( ( ) => {
183+ this . _events . load ( user ) ;
184+ return user ;
185+ } ) ;
186+ }
187+ else {
188+ return null ;
189+ }
190+ } ) ;
191+ } ) ; ;
192+ }
193+
194+ _signinSilentIframe ( args = { } ) {
147195 let url = args . redirect_uri || this . settings . silent_redirect_uri ;
148196 if ( ! url ) {
149197 Log . error ( "UserManager.signinSilent: No silent_redirect_uri configured" ) ;
@@ -153,21 +201,9 @@ export class UserManager extends OidcClient {
153201 args . redirect_uri = url ;
154202 args . prompt = args . prompt || "none" ;
155203
156- let setIdToken ;
157- if ( args . id_token_hint || ! this . settings . includeIdTokenInSilentRenew ) {
158- setIdToken = Promise . resolve ( ) ;
159- }
160- else {
161- setIdToken = this . _loadUser ( ) . then ( user => {
162- args . id_token_hint = user && user . id_token ;
163- } ) ;
164- }
165-
166- return setIdToken . then ( ( ) => {
167- return this . _signin ( args , this . _iframeNavigator , {
168- startUrl : url ,
169- silentRequestTimeout : args . silentRequestTimeout || this . settings . silentRequestTimeout
170- } ) ;
204+ return this . _signin ( args , this . _iframeNavigator , {
205+ startUrl : url ,
206+ silentRequestTimeout : args . silentRequestTimeout || this . settings . silentRequestTimeout
171207 } ) . then ( user => {
172208 if ( user ) {
173209 if ( user . profile && user . profile . sub ) {
@@ -181,6 +217,7 @@ export class UserManager extends OidcClient {
181217 return user ;
182218 } ) ;
183219 }
220+
184221 signinSilentCallback ( url ) {
185222 return this . _signinCallback ( url , this . _iframeNavigator ) . then ( user => {
186223 if ( user ) {
@@ -384,6 +421,7 @@ export class UserManager extends OidcClient {
384421 Log . debug ( "UserManager.revokeAccessToken: removing token properties from user and re-storing" ) ;
385422
386423 user . access_token = null ;
424+ user . refresh_token = null ;
387425 user . expires_at = null ;
388426 user . token_type = null ;
389427
@@ -399,17 +437,43 @@ export class UserManager extends OidcClient {
399437 }
400438
401439 _revokeInternal ( user , required ) {
402- var access_token = user && user . access_token ;
440+ if ( user ) {
441+ var access_token = user . access_token ;
442+ var refresh_token = user . refresh_token ;
443+
444+ return this . _revokeAccessTokenInternal ( access_token , require )
445+ . then ( atSuccess => {
446+ return this . _revokeRefreshTokenInternal ( refresh_token , required )
447+ . then ( rtSuccess => {
448+ if ( ! atSuccess && ! rtSuccess ) {
449+ Log . debug ( "UserManager.revokeAccessToken: no need to revoke due to no token(s), or JWT format" ) ;
450+ }
451+
452+ return atSuccess || rtSuccess ;
453+ } ) ;
454+ } ) ;
455+ }
456+
457+ return Promise . resolve ( false ) ;
458+ }
403459
460+ _revokeAccessTokenInternal ( access_token , required ) {
404461 // check for JWT vs. reference token
405462 if ( ! access_token || access_token . indexOf ( '.' ) >= 0 ) {
406- Log . debug ( "UserManager.revokeAccessToken: no need to revoke due to no user, token, or JWT format" ) ;
407463 return Promise . resolve ( false ) ;
408464 }
409465
410466 return this . _tokenRevocationClient . revoke ( access_token , required ) . then ( ( ) => true ) ;
411467 }
412468
469+ _revokeRefreshTokenInternal ( refresh_token , required ) {
470+ if ( ! refresh_token ) {
471+ return Promise . resolve ( false ) ;
472+ }
473+
474+ return this . _tokenRevocationClient . revoke ( refresh_token , required , "refresh_token" ) . then ( ( ) => true ) ;
475+ }
476+
413477 startSilentRenew ( ) {
414478 this . _silentRenewService . start ( ) ;
415479 }
0 commit comments