|
@ -19,6 +19,7 @@ module.exports = { |
|
|
}, |
|
|
}, |
|
|
groups: {}, |
|
|
groups: {}, |
|
|
validApiKeys: [], |
|
|
validApiKeys: [], |
|
|
|
|
|
revokationList: require('./cache').init(), |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* Initialize the authentication module |
|
|
* Initialize the authentication module |
|
@ -111,10 +112,28 @@ module.exports = { |
|
|
authenticate(req, res, next) { |
|
|
authenticate(req, res, next) { |
|
|
WIKI.auth.passport.authenticate('jwt', {session: false}, async (err, user, info) => { |
|
|
WIKI.auth.passport.authenticate('jwt', {session: false}, async (err, user, info) => { |
|
|
if (err) { return next() } |
|
|
if (err) { return next() } |
|
|
|
|
|
let mustRevalidate = false |
|
|
|
|
|
|
|
|
// Expired but still valid within N days, just renew
|
|
|
// Expired but still valid within N days, just renew
|
|
|
if (info instanceof Error && info.name === 'TokenExpiredError' && |
|
|
|
|
|
moment().subtract(ms(WIKI.config.auth.tokenRenewal), 'ms').isBefore(info.expiredAt)) { |
|
|
|
|
|
|
|
|
if (info instanceof Error && info.name === 'TokenExpiredError' && moment().subtract(ms(WIKI.config.auth.tokenRenewal), 'ms').isBefore(info.expiredAt)) { |
|
|
|
|
|
mustRevalidate = true |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Check if user / group is in revokation list
|
|
|
|
|
|
if (user) { |
|
|
|
|
|
if (WIKI.auth.revokationList.has(`u${_.toString(user.id)}`)) { |
|
|
|
|
|
mustRevalidate = true |
|
|
|
|
|
} |
|
|
|
|
|
for (const gid of user.groups) { |
|
|
|
|
|
if (WIKI.auth.revokationList.has(`g${_.toString(gid)}`)) { |
|
|
|
|
|
mustRevalidate = true |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Revalidate and renew token
|
|
|
|
|
|
if (mustRevalidate) { |
|
|
|
|
|
console.info('MUST REVALIDATE') |
|
|
const jwtPayload = jwt.decode(securityHelper.extractJWT(req)) |
|
|
const jwtPayload = jwt.decode(securityHelper.extractJWT(req)) |
|
|
try { |
|
|
try { |
|
|
const newToken = await WIKI.models.users.refreshToken(jwtPayload.id) |
|
|
const newToken = await WIKI.models.users.refreshToken(jwtPayload.id) |
|
@ -380,6 +399,9 @@ module.exports = { |
|
|
WIKI.events.inbound.on('reloadAuthStrategies', () => { |
|
|
WIKI.events.inbound.on('reloadAuthStrategies', () => { |
|
|
WIKI.auth.activateStrategies() |
|
|
WIKI.auth.activateStrategies() |
|
|
}) |
|
|
}) |
|
|
|
|
|
WIKI.events.inbound.on('addAuthRevoke', (args) => { |
|
|
|
|
|
WIKI.auth.revokeUserTokens(args) |
|
|
|
|
|
}) |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
@ -410,5 +432,13 @@ module.exports = { |
|
|
manage: WIKI.auth.checkAccess(req.user, ['manage:system'], page) |
|
|
manage: WIKI.auth.checkAccess(req.user, ['manage:system'], page) |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* Add user / group ID to JWT revokation list, forcing all requests to be validated against the latest permissions |
|
|
|
|
|
*/ |
|
|
|
|
|
revokeUserTokens ({ id, kind = 'u' }) { |
|
|
|
|
|
console.info(Math.ceil(ms(WIKI.config.auth.tokenRenewal) / 1000)) |
|
|
|
|
|
WIKI.auth.revokationList.set(`${kind}${_.toString(id)}`, true, Math.ceil(ms(WIKI.config.auth.tokenRenewal) / 1000)) |
|
|
} |
|
|
} |
|
|
} |
|
|
} |