@@ -168,23 +168,27 @@ function initWebId (argv, app, ldp) {
168
168
// (for same-domain browsing by people only)
169
169
const useSecureCookies = ! ! argv . sslKey // use secure cookies when over HTTPS
170
170
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.
171
176
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 ( )
188
192
} )
189
193
190
194
let accountManager = AccountManager . from ( {
@@ -209,6 +213,15 @@ function initWebId (argv, app, ldp) {
209
213
}
210
214
}
211
215
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
+
212
225
/**
213
226
* Sets up authentication-related routes and handlers for the app.
214
227
*
0 commit comments