fix(auth): keycloak authentication post logout redirect for Keycloak 18+ (#5878)
This commit is contained in:
		| @@ -866,7 +866,7 @@ module.exports = class User extends Model { | |||||||
|     } |     } | ||||||
|     const usr = await WIKI.models.users.query().findById(context.req.user.id).select('providerKey') |     const usr = await WIKI.models.users.query().findById(context.req.user.id).select('providerKey') | ||||||
|     const provider = _.find(WIKI.auth.strategies, ['key', usr.providerKey]) |     const provider = _.find(WIKI.auth.strategies, ['key', usr.providerKey]) | ||||||
|     return provider.logout ? provider.logout(provider.config) : '/' |     return provider.logout ? provider.logout(provider.config, context) : '/' | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   static async getGuestUser () { |   static async getGuestUser () { | ||||||
|   | |||||||
| @@ -21,7 +21,7 @@ module.exports = { | |||||||
|         clientSecret: conf.clientSecret, |         clientSecret: conf.clientSecret, | ||||||
|         callbackURL: conf.callbackURL, |         callbackURL: conf.callbackURL, | ||||||
|         passReqToCallback: true |         passReqToCallback: true | ||||||
|       }, async (req, accessToken, refreshToken, profile, cb) => { |       }, async (req, accessToken, refreshToken, results, profile, cb) => { | ||||||
|         let displayName = profile.username |         let displayName = profile.username | ||||||
|         if (_.isString(profile.fullName) && profile.fullName.length > 0) { |         if (_.isString(profile.fullName) && profile.fullName.length > 0) { | ||||||
|           displayName = profile.fullName |           displayName = profile.fullName | ||||||
| @@ -36,6 +36,7 @@ module.exports = { | |||||||
|               picture: '' |               picture: '' | ||||||
|             } |             } | ||||||
|           }) |           }) | ||||||
|  |           req.session.keycloak_id_token = results.id_token | ||||||
|           cb(null, user) |           cb(null, user) | ||||||
|         } catch (err) { |         } catch (err) { | ||||||
|           cb(err, null) |           cb(err, null) | ||||||
| @@ -43,11 +44,22 @@ module.exports = { | |||||||
|       }) |       }) | ||||||
|     ) |     ) | ||||||
|   }, |   }, | ||||||
|   logout (conf) { |   logout (conf, context) { | ||||||
|     if (!conf.logoutUpstream) { |     if (!conf.logoutUpstream) { | ||||||
|       return '/' |       return '/' | ||||||
|     } else if (conf.logoutURL && conf.logoutURL.length > 5) { |     } else if (conf.logoutURL && conf.logoutURL.length > 5) { | ||||||
|       return `${conf.logoutURL}?redirect_uri=${encodeURIComponent(WIKI.config.host)}` |       const idToken = context.req.session.keycloak_id_token | ||||||
|  |       const redirURL = encodeURIComponent(WIKI.config.host) | ||||||
|  |       if (conf.logoutUpstreamRedirectLegacy) { | ||||||
|  |         // keycloak < 18 | ||||||
|  |         return `${conf.logoutURL}?redirect_uri=${redirURL}` | ||||||
|  |       } else if (idToken) { | ||||||
|  |         // keycloak 18+ | ||||||
|  |         return `${conf.logoutURL}?post_logout_redirect_uri=${redirURL}&id_token_hint=${idToken}` | ||||||
|  |       } else { | ||||||
|  |         // fall back to no redirect if keycloak_id_token isn't available | ||||||
|  |         return conf.logoutURL | ||||||
|  |       } | ||||||
|     } else { |     } else { | ||||||
|       WIKI.logger.warn('Keycloak logout URL is not configured!') |       WIKI.logger.warn('Keycloak logout URL is not configured!') | ||||||
|       return '/' |       return '/' | ||||||
|   | |||||||
| @@ -57,4 +57,9 @@ props: | |||||||
|     title: Logout Endpoint URL |     title: Logout Endpoint URL | ||||||
|     hint: e.g. https://KEYCLOAK-HOST/auth/realms/YOUR-REALM/protocol/openid-connect/logout |     hint: e.g. https://KEYCLOAK-HOST/auth/realms/YOUR-REALM/protocol/openid-connect/logout | ||||||
|     order: 9 |     order: 9 | ||||||
|  |   logoutUpstreamRedirectLegacy: | ||||||
|  |     type: Boolean | ||||||
|  |     title: Legacy Logout Redirect | ||||||
|  |     hint: Pass the legacy 'redirect_uri' parameter to the logout endpoint. Leave disabled for Keycloak 18 and above. | ||||||
|  |     order: 10 | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user