Introduce an environment variable to control user creation in OIDC authentication, closes #47

This commit is contained in:
yu-i-i
2026-09-22 02:41:35 +02:00
parent 44c25117d4
commit 40a45e6dc9
4 changed files with 12 additions and 8 deletions
@@ -53,7 +53,7 @@ const Features = {
case 'registration-page': case 'registration-page':
return ( return (
!Features.externalAuthenticationSystemUsed() || !Features.externalAuthenticationSystemUsed() ||
Boolean(Settings.overleaf) Boolean(Settings.overleaf) || Settings.oidc?.disableJITAccountCreation
) )
case 'registration': case 'registration':
return Boolean(Settings.overleaf) return Boolean(Settings.overleaf)
@@ -42,7 +42,8 @@ const OIDCAuthenticationController = {
} }
} else { } else {
if (info.redir != null) { if (info.redir != null) {
return res.json({ redir: info.redir }) await UserController.doLogout(req)
return res.redirect(info.redir)
} else { } else {
res.status(info.status || 401) res.status(info.status || 401)
delete info.status delete info.status
@@ -95,20 +96,19 @@ const OIDCAuthenticationController = {
info: { info: {
type: 'error', type: 'error',
text: error.message, text: error.message,
status: 401, status: 500,
}, },
} }
} }
if (user) { if (user) {
return { user, info: undefined } return { user, info: undefined }
} else { // we cannot be here, something is terribly wrong } else { // user account is not created
logger.debug({ email : profile.emails[0].value }, 'failed OIDC log in') logger.debug({ email : profile.emails[0].value }, 'OIDC users JIT account creation is off')
return { return {
user: false, user: false,
info: { info: {
type: 'error', redir: '/register',
text: 'Unknown error', status: 401,
status: 500,
}, },
} }
} }
@@ -37,6 +37,9 @@ const OIDCAuthenticationManager = {
// (Is it safe? Concider: If an account from the specified provider is already linked to this user, throw an error) // (Is it safe? Concider: If an account from the specified provider is already linked to this user, throw an error)
user = await User.findOne({ 'email': email }).exec() user = await User.findOne({ 'email': email }).exec()
if (!user) { if (!user) {
if (Settings.oidc.disableJITAccountCreation) {
return null
}
user = await UserCreator.promises.createNewUser( user = await UserCreator.promises.createNewUser(
{ {
email: email, email: email,
@@ -17,6 +17,7 @@ const OIDCModuleManager = {
attAdmin: process.env.OVERLEAF_OIDC_IS_ADMIN_FIELD, attAdmin: process.env.OVERLEAF_OIDC_IS_ADMIN_FIELD,
valAdmin: process.env.OVERLEAF_OIDC_IS_ADMIN_FIELD_VALUE, valAdmin: process.env.OVERLEAF_OIDC_IS_ADMIN_FIELD_VALUE,
updateUserDetailsOnLogin: boolFromEnv(process.env.OVERLEAF_OIDC_UPDATE_USER_DETAILS_ON_LOGIN), updateUserDetailsOnLogin: boolFromEnv(process.env.OVERLEAF_OIDC_UPDATE_USER_DETAILS_ON_LOGIN),
disableJITAccountCreation: boolFromEnv(process.env.OVERLEAF_OIDC_DISABLE_JIT_ACCOUNT_CREATION),
} }
}, },
passportSetup(passport, callback) { passportSetup(passport, callback) {