finalization of create token logic

This commit is contained in:
Sheen Capadngan
2023-08-06 21:46:20 +08:00
parent 04fdccc45d
commit 3a9bf5409b
4 changed files with 29 additions and 30 deletions
+6 -8
View File
@@ -56,10 +56,9 @@ export const login1 = async (req: Request, res: Response) => {
if (!user) throw new Error("Failed to find user"); if (!user) throw new Error("Failed to find user");
const shouldValidateProviderAuth = (user.authProvider && user.authProvider !== AuthProvider.EMAIL) let authProviders = [...(user.authProviders || []), user.authProvider];
|| (user.authProviders && !user.authProviders?.includes(AuthProvider.EMAIL))
if (!authProviders.includes(AuthProvider.EMAIL)) {
if (shouldValidateProviderAuth) {
await validateProviderAuthToken({ await validateProviderAuthToken({
email, email,
user, user,
@@ -119,10 +118,9 @@ export const login2 = async (req: Request, res: Response) => {
if (!user) throw new Error("Failed to find user"); if (!user) throw new Error("Failed to find user");
const shouldValidateProviderAuth = (user.authProvider && user.authProvider !== AuthProvider.EMAIL) let authProviders = [...(user.authProviders || []), user.authProvider];
|| (user.authProviders && !user.authProviders?.includes(AuthProvider.EMAIL))
if (!authProviders.includes(AuthProvider.EMAIL)) {
if (shouldValidateProviderAuth) {
await validateProviderAuthToken({ await validateProviderAuthToken({
email, email,
user, user,
+2 -3
View File
@@ -390,11 +390,10 @@ export const validateProviderAuthToken = async ({
jwt.verify(providerAuthToken, await getJwtProviderAuthSecret()) jwt.verify(providerAuthToken, await getJwtProviderAuthSecret())
); );
const doesProviderMatch = (user.authProvider && user.authProvider === decodedToken.authProvider) let authProviders = [...(user.authProviders || []), user.authProvider];
|| (user.authProviders && user.authProviders.includes(decodedToken.authProvider));
if ( if (
!doesProviderMatch || !authProviders.includes(decodedToken.authProvider) ||
decodedToken.email !== email decodedToken.email !== email
) { ) {
throw new Error("Invalid authentication credentials.") throw new Error("Invalid authentication credentials.")
+1
View File
@@ -46,6 +46,7 @@ const userSchema = new Schema<IUser>(
}, },
authProviders: [{ authProviders: [{
type: String, type: String,
enum: AuthProvider,
}], }],
email: { email: {
type: String, type: String,
+20 -19
View File
@@ -97,20 +97,22 @@ const initializePassport = async () => {
email email
}).select("+publicKey"); }).select("+publicKey");
if (user && user.authProvider !== AuthProvider.GOOGLE) {
done(InternalServerError());
}
if (!user) { if (!user) {
user = await new User({ user = await new User({
email, email,
authProvider: AuthProvider.GOOGLE, authProviders: [AuthProvider.GOOGLE],
authId: profile.id, authId: profile.id,
firstName: profile.name.givenName, firstName: profile.name.givenName,
lastName: profile.name.familyName lastName: profile.name.familyName
}).save(); }).save();
} }
let authProviders = [...(user.authProviders || []), user.authProvider];
if (!authProviders.includes(AuthProvider.GOOGLE)) {
done(InternalServerError());
}
const isUserCompleted = !!user.publicKey; const isUserCompleted = !!user.publicKey;
const providerAuthToken = createToken({ const providerAuthToken = createToken({
payload: { payload: {
@@ -118,8 +120,7 @@ const initializePassport = async () => {
email: user.email, email: user.email,
firstName: user.firstName, firstName: user.firstName,
lastName: user.lastName, lastName: user.lastName,
authProvider: user.authProvider, authProvider: AuthProvider.GOOGLE,
authProviders: user.authProviders,
isUserCompleted, isUserCompleted,
...(req.query.state ? { ...(req.query.state ? {
callbackPort: req.query.state as string callbackPort: req.query.state as string
@@ -151,21 +152,23 @@ const initializePassport = async () => {
let user = await User.findOne({ let user = await User.findOne({
email email
}).select("+publicKey"); }).select("+publicKey");
if (user && user.authProvider !== AuthProvider.GITHUB) {
done(InternalServerError());
}
if (!user) { if (!user) {
user = await new User({ user = await new User({
email: email, email: email,
authProvider: AuthProvider.GITHUB, authProviders: [AuthProvider.GITHUB],
authId: profile.id, authId: profile.id,
firstName: profile.displayName, firstName: profile.displayName,
lastName: "" lastName: ""
}).save(); }).save();
} }
let authProviders = [...(user.authProviders || []), user.authProvider];
if (!authProviders.includes(AuthProvider.GITHUB)) {
done(InternalServerError());
}
const isUserCompleted = !!user.publicKey; const isUserCompleted = !!user.publicKey;
const providerAuthToken = createToken({ const providerAuthToken = createToken({
payload: { payload: {
@@ -173,8 +176,7 @@ const initializePassport = async () => {
email: user.email, email: user.email,
firstName: user.firstName, firstName: user.firstName,
lastName: user.lastName, lastName: user.lastName,
authProvider: user.authProvider, authProvider: AuthProvider.GITHUB,
authProviders: user.authProviders,
isUserCompleted, isUserCompleted,
...(req.query.state ? { ...(req.query.state ? {
callbackPort: req.query.state as string callbackPort: req.query.state as string
@@ -249,7 +251,7 @@ const initializePassport = async () => {
await User.findByIdAndUpdate( await User.findByIdAndUpdate(
user._id, user._id,
{ {
authProvider: req.ssoConfig.authProvider authProviders: [req.ssoConfig.authProvider]
}, },
{ {
new: true new: true
@@ -281,7 +283,7 @@ const initializePassport = async () => {
} else { } else {
user = await new User({ user = await new User({
email, email,
authProvider: req.ssoConfig.authProvider, authProviders: [req.ssoConfig.authProvider],
firstName, firstName,
lastName lastName
}).save(); }).save();
@@ -303,8 +305,7 @@ const initializePassport = async () => {
firstName, firstName,
lastName, lastName,
organizationName: organization?.name, organizationName: organization?.name,
authProvider: user.authProvider, authProvider: req.ssoConfig.authProvider,
authProviders: user.authProviders,
isUserCompleted, isUserCompleted,
...(req.body.RelayState ? { ...(req.body.RelayState ? {
callbackPort: req.body.RelayState as string callbackPort: req.body.RelayState as string