@@ -168,23 +168,27 @@ function initWebId (argv, app, ldp) {
168168 // (for same-domain browsing by people only)
169169 const useSecureCookies = ! ! argv . sslKey // use secure cookies when over HTTPS
170170 const sessionHandler = session ( sessionSettings ( useSecureCookies , argv . host ) )
171+ app . use ( sessionHandler )
172+ // Reject cookies from third-party applications.
173+ // Otherwise, when a user is logged in to their Solid server,
174+ // any third-party application could perform authenticated requests
175+ // without permission by including the credentials set by the Solid server.
171176 app . use ( ( req , res , next ) => {
172- sessionHandler ( req , res , ( ) => {
173- // Reject cookies from third-party applications.
174- // Otherwise, when a user is logged in to their Solid server,
175- // any third-party application could perform authenticated requests
176- // without permission by including the credentials set by the Solid server.
177- const origin = req . headers . origin
178- const userId = req . session . userId
179- if ( ! argv . host . allowsSessionFor ( userId , origin ) ) {
180- debug ( `Rejecting session for ${ userId } from ${ origin } ` )
181- // Destroy session data
182- delete req . session . userId
183- // Ensure this modified session is not saved
184- req . session . save = ( done ) => done ( )
185- }
186- next ( )
187- } )
177+ const origin = req . headers . origin
178+ const userId = req . session . userId
179+ // Exception: allow logout requests from all third-party apps
180+ // such that OIDC client can log out via cookie auth
181+ // TODO: remove this exception when OIDC clients
182+ // use Bearer token to authenticate instead of cookie
183+ // (https://github.com/solid/node-solid-server/pull/835#issuecomment-426429003)
184+ if ( ! argv . host . allowsSessionFor ( userId , origin ) && ! isLogoutRequest ( req ) ) {
185+ debug ( `Rejecting session for ${ userId } from ${ origin } ` )
186+ // Destroy session data
187+ delete req . session . userId
188+ // Ensure this modified session is not saved
189+ req . session . save = ( done ) => done ( )
190+ }
191+ next ( )
188192 } )
189193
190194 let accountManager = AccountManager . from ( {
@@ -209,6 +213,15 @@ function initWebId (argv, app, ldp) {
209213 }
210214}
211215
216+ /**
217+ * Determines whether the given request is a logout request
218+ */
219+ function isLogoutRequest ( req ) {
220+ // TODO: this is a hack that hard-codes OIDC paths,
221+ // this code should live in the OIDC module
222+ return req . path === '/logout' || req . path === '/goodbye'
223+ }
224+
212225/**
213226 * Sets up authentication-related routes and handlers for the app.
214227 *
0 commit comments