Skip to content

Commit 0a48614

Browse files
committed
Allow logout requests from all third-party apps.
1 parent e3050b9 commit 0a48614

File tree

1 file changed

+29
-16
lines changed

1 file changed

+29
-16
lines changed

lib/create-app.js

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)