This commit is contained in:
Rory Powell 2021-07-08 13:12:25 +01:00
parent aa601f3701
commit db9078cebe
6 changed files with 115 additions and 100 deletions

View File

@ -11,14 +11,15 @@ async function authenticate(accessToken, refreshToken, profile, done) {
email: profile._json.email,
oauth2: {
accessToken: accessToken,
refreshToken: refreshToken
}
refreshToken: refreshToken,
},
}
return authenticateThirdParty(
thirdPartyUser,
true, // require local accounts to exist
done)
done
)
}
/**

View File

@ -12,7 +12,6 @@ const { authenticateThirdParty } = require("./third-party-common")
* @param {*} idToken The id_token - always a JWT
* @param {*} params The response body from requesting an access_token
* @param {*} done The passport callback: err, user, info
* @returns
*/
async function authenticate(
issuer,
@ -34,14 +33,15 @@ async function authenticate(
email: getEmail(profile, jwtClaims),
oauth2: {
accessToken: accessToken,
refreshToken: refreshToken
}
refreshToken: refreshToken,
},
}
return authenticateThirdParty(
thirdPartyUser,
false, // don't require local accounts to exist
done)
done
)
}
/**
@ -65,12 +65,15 @@ function getEmail(profile, jwtClaims) {
return username
}
return null;
return null
}
function validEmail(value) {
return (
(value && !!value.match(/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/))
value &&
!!value.match(
/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
)
)
}
@ -92,7 +95,9 @@ exports.strategyFactory = async function (config, callbackUrl) {
const response = await fetch(configUrl)
if (!response.ok) {
throw new Error(`Unexpected response when fetching openid-configuration: ${response.statusText}`)
throw new Error(
`Unexpected response when fetching openid-configuration: ${response.statusText}`
)
}
const body = await response.json()
@ -110,7 +115,6 @@ exports.strategyFactory = async function (config, callbackUrl) {
},
authenticate
)
} catch (err) {
console.error(err)
throw new Error("Error constructing OIDC authentication strategy", err)

View File

@ -15,10 +15,13 @@ exports.authenticateThirdParty = async function (
thirdPartyUser,
requireLocalAccount = true,
done
) {
if (!thirdPartyUser.provider) return authError(done, "third party user provider required")
if (!thirdPartyUser.userId) return authError(done, "third party user id required")
if (!thirdPartyUser.email) return authError(done, "third party user email required")
) {
if (!thirdPartyUser.provider)
return authError(done, "third party user provider required")
if (!thirdPartyUser.userId)
return authError(done, "third party user id required")
if (!thirdPartyUser.email)
return authError(done, "third party user email required")
const db = database.getDB(StaticDatabases.GLOBAL.name)
@ -32,7 +35,11 @@ exports.authenticateThirdParty = async function (
} catch (err) {
// abort when not 404 error
if (!err.status || err.status !== 404) {
return authError(done, "Unexpected error when retrieving existing user", err)
return authError(
done,
"Unexpected error when retrieving existing user",
err
)
}
// check user already exists by email
@ -43,7 +50,10 @@ exports.authenticateThirdParty = async function (
const userExists = users.rows.length > 0
if (requireLocalAccount && !userExists) {
return authError(done, "Email does not yet exist. You must set up your local budibase account first.")
return authError(
done,
"Email does not yet exist. You must set up your local budibase account first."
)
}
// create the user to save
@ -101,7 +111,7 @@ function constructNewUser(userId, thirdPartyUser) {
provider: thirdPartyUser.provider,
providerType: thirdPartyUser.providerType,
email: thirdPartyUser.email,
roles: {}
roles: {},
}
// persist profile information
@ -110,14 +120,14 @@ function constructNewUser(userId, thirdPartyUser) {
// Is this okay to change?
if (thirdPartyUser.profile) {
user.thirdPartyProfile = {
...thirdPartyUser.profile._json
...thirdPartyUser.profile._json,
}
}
// persist oauth tokens for future use
if (thirdPartyUser.oauth2) {
user.oauth2 = {
...thirdPartyUser.oauth2
...thirdPartyUser.oauth2,
}
}

View File

@ -85,7 +85,7 @@
let fileName = e.target.files[0].name
image = e.target.files[0]
providers.oidc.config["iconName"] = fileName
iconDropdownOptions.unshift({label: fileName, value: fileName})
iconDropdownOptions.unshift({ label: fileName, value: fileName })
}
const providers = { google, oidc }

View File

@ -14,14 +14,14 @@ const GLOBAL_DB = authPkg.StaticDatabases.GLOBAL.name
function authInternal(ctx, user, err = null, info = null) {
if (err) {
console.error("Authentication error", err)
return ctx.throw(403, info? info : "Unauthorized")
return ctx.throw(403, info ? info : "Unauthorized")
}
const expires = new Date()
expires.setDate(expires.getDate() + 1)
if (!user) {
return ctx.throw(403, info? info : "Unauthorized")
return ctx.throw(403, info ? info : "Unauthorized")
}
ctx.cookies.set(Cookies.Auth, user.token, {