@@ -209,6 +209,10 @@ export class Client {
209209 sessionInfo . expiresIn = loginData . expires_in ;
210210 }
211211
212+ if ( loginData . id_token ) {
213+ sessionInfo . idToken = loginData . id_token ;
214+ }
215+
212216 if ( loginData . oidc_issuer ) {
213217 sessionInfo . oidcIssuer = loginData . oidc_issuer ;
214218 sessionInfo . oidcClientId = loginData . oidc_client_id ;
@@ -236,7 +240,7 @@ export class Client {
236240 } ) ;
237241 }
238242
239- async _createSessionAfterAuth ( { deviceId, userId, accessToken, refreshToken, homeserver, expiresIn, oidcIssuer, oidcClientId, accountManagementUrl} , inspectAccountSetup , log ) {
243+ async _createSessionAfterAuth ( { deviceId, userId, accessToken, refreshToken, homeserver, expiresIn, idToken , oidcIssuer, oidcClientId, accountManagementUrl} , inspectAccountSetup , log ) {
240244 const id = this . createNewSessionId ( ) ;
241245 const lastUsed = this . _platform . clock . now ( ) ;
242246 const sessionInfo = {
@@ -251,6 +255,7 @@ export class Client {
251255 oidcIssuer,
252256 oidcClientId,
253257 accountManagementUrl,
258+ idToken,
254259 } ;
255260 if ( expiresIn ) {
256261 sessionInfo . accessTokenExpiresAt = lastUsed + expiresIn * 1000 ;
@@ -497,34 +502,51 @@ export class Client {
497502 return ! this . _reconnector ;
498503 }
499504
500- startLogout ( sessionId ) {
505+ startLogout ( sessionId , urlRouter ) {
501506 return this . _platform . logger . run ( "logout" , async log => {
502507 this . _sessionId = sessionId ;
503508 log . set ( "id" , this . _sessionId ) ;
504509 const sessionInfo = await this . _platform . sessionInfoStorage . get ( this . _sessionId ) ;
505510 if ( ! sessionInfo ) {
506511 throw new Error ( `Could not find session for id ${ this . _sessionId } ` ) ;
507512 }
513+ let endSessionRedirectEndpoint ;
508514 try {
509- const hsApi = new HomeServerApi ( {
510- homeserver : sessionInfo . homeServer ,
511- accessToken : sessionInfo . accessToken ,
512- request : this . _platform . request
513- } ) ;
514- await hsApi . logout ( { log} ) . response ( ) ;
515- const oidcApi = new OidcApi ( {
516- issuer : sessionInfo . oidcIssuer ,
517- clientId : sessionInfo . oidcClientId ,
518- request : this . _platform . request ,
519- encoding : this . _platform . encoding ,
520- crypto : this . _platform . crypto ,
521- } ) ;
522- await oidcApi . revokeToken ( { token : sessionInfo . accessToken , type : "access" } ) ;
523- if ( sessionInfo . refreshToken ) {
524- await oidcApi . revokeToken ( { token : sessionInfo . refreshToken , type : "refresh" } ) ;
515+ if ( sessionInfo . oidcClientId ) {
516+ // OIDC logout
517+ const oidcApi = new OidcApi ( {
518+ issuer : sessionInfo . oidcIssuer ,
519+ clientId : sessionInfo . oidcClientId ,
520+ request : this . _platform . request ,
521+ encoding : this . _platform . encoding ,
522+ crypto : this . _platform . crypto ,
523+ urlRouter,
524+ } ) ;
525+ await oidcApi . revokeToken ( { token : sessionInfo . accessToken , type : "access" } ) ;
526+ if ( sessionInfo . refreshToken ) {
527+ await oidcApi . revokeToken ( { token : sessionInfo . refreshToken , type : "refresh" } ) ;
528+ }
529+ endSessionRedirectEndpoint = await oidcApi . endSessionEndpoint ( {
530+ idTokenHint : sessionInfo . idToken ,
531+ logoutHint : sessionInfo . userId ,
532+ } )
533+ } else {
534+ // regular logout
535+ const hsApi = new HomeServerApi ( {
536+ homeserver : sessionInfo . homeServer ,
537+ accessToken : sessionInfo . accessToken ,
538+ request : this . _platform . request
539+ } ) ;
540+ await hsApi . logout ( { log} ) . response ( ) ;
525541 }
526- } catch ( err ) { }
542+ } catch ( err ) {
543+ console . error ( err ) ;
544+ }
527545 await this . deleteSession ( log ) ;
546+ // OIDC might have given us a redirect URI to go to do tell the OP we are signing out
547+ if ( endSessionRedirectEndpoint ) {
548+ this . _platform . openUrl ( endSessionRedirectEndpoint ) ;
549+ }
528550 } ) ;
529551 }
530552
0 commit comments