fix: fixed the timestamp comparison login in verifyPasswordlessTokens route

This commit is contained in:
Balu Babu
2023-01-13 01:46:34 +05:30
parent f4df8873be
commit 5fe934110e
4 changed files with 57 additions and 4 deletions

View File

@@ -215,8 +215,35 @@ export class AuthService {
statusCode: HttpStatus.NOT_FOUND, statusCode: HttpStatus.NOT_FOUND,
}); });
const currentTime = DateTime.now().toISOTime(); const user = await this.usersService.findUserById(
//TODO: new to check this datetime checking logic passwordlessTokens.value.userUid,
);
if (O.isNone(user))
return E.left({
message: USER_NOT_FOUND,
statusCode: HttpStatus.NOT_FOUND,
});
// Check to see if entry for magic-link is present in the Account table for this user
const profile = {
provider: 'email',
id: user.value.email,
};
const providerAccountExists = await this.checkIfProviderAccountExists(
user.value,
profile,
);
if (O.isNone(providerAccountExists)) {
await this.usersService.createProviderAccount(
user.value,
null,
null,
profile,
);
}
const currentTime = DateTime.now().toISO();
if (currentTime > passwordlessTokens.value.expiresOn.toISOString()) if (currentTime > passwordlessTokens.value.expiresOn.toISOString())
return E.left({ return E.left({
message: MAGIC_LINK_EXPIRED, message: MAGIC_LINK_EXPIRED,

View File

@@ -3,10 +3,14 @@ import { PassportStrategy } from '@nestjs/passport';
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { UserService } from 'src/user/user.service'; import { UserService } from 'src/user/user.service';
import * as O from 'fp-ts/Option'; import * as O from 'fp-ts/Option';
import { AuthService } from '../auth.service';
@Injectable() @Injectable()
export class GoogleStrategy extends PassportStrategy(Strategy) { export class GoogleStrategy extends PassportStrategy(Strategy) {
constructor(private usersService: UserService) { constructor(
private usersService: UserService,
private authService: AuthService,
) {
super({ super({
clientID: process.env.GOOGLE_CLIENT_ID, clientID: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET, clientSecret: process.env.GOOGLE_CLIENT_SECRET,
@@ -30,6 +34,18 @@ export class GoogleStrategy extends PassportStrategy(Strategy) {
return createdUser; return createdUser;
} }
// Check to see if entry for google is present in the Account table for this user
const providerAccountExists =
await this.authService.checkIfProviderAccountExists(user.value, profile);
if (O.isNone(providerAccountExists))
await this.usersService.createProviderAccount(
user.value,
accessToken,
refreshToken,
profile,
);
return user.value; return user.value;
} }
} }

View File

@@ -1,3 +1,8 @@
import { User } from '@prisma/client'; import { User } from '@prisma/client';
export type AuthUser = User; export type AuthUser = User;
export interface SSOProviderProfile {
provider: string;
id: string;
}

View File

@@ -1,6 +1,7 @@
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { PrismaService } from 'src/prisma/prisma.service'; import { PrismaService } from 'src/prisma/prisma.service';
import * as O from 'fp-ts/Option'; import * as O from 'fp-ts/Option';
import { AuthUser, SSOProviderProfile } from 'src/types/AuthUser';
@Injectable() @Injectable()
export class UserService { export class UserService {
@@ -71,11 +72,15 @@ export class UserService {
async createProviderAccount(user, accessToken, refreshToken, profile) { async createProviderAccount(user, accessToken, refreshToken, profile) {
const createdProvider = await this.prisma.account.create({ const createdProvider = await this.prisma.account.create({
data: { data: {
userId: user.id,
provider: profile.provider, provider: profile.provider,
providerAccountId: profile.id, providerAccountId: profile.id,
providerRefreshToken: refreshToken ? refreshToken : null, providerRefreshToken: refreshToken ? refreshToken : null,
providerAccessToken: accessToken ? accessToken : null, providerAccessToken: accessToken ? accessToken : null,
user: {
connect: {
id: user.id,
},
},
}, },
}); });