Compare commits

..

No commits in common. "main" and "feature/refactor-login" have entirely different histories.

5 changed files with 36 additions and 46 deletions

View File

@ -1,6 +0,0 @@
# Local Postgres
POSTGRES_USER=root
POSTGRES_PASSWORD=root
POSTGRES_DB=ticket_mvp
PGADMIN_DEFAULT_EMAIL=admin@admin.com
PGADMIN_DEFAULT_PASSWORD=root

View File

@ -1,32 +0,0 @@
# Environment
NODE_ENV = development
# App Environment
APP_URL = http://localhost:4200
# DB
DB_HOST = localhost
DB_PORT = 5432
DB_USERNAME = root
DB_PASSWORD = root
DB_NAME = ticket_mvp
# CORS
CORS_ALLOW_ORIGIN=http://localhost:4200,http://localhost:5000,null
CORS_ALLOW_METHODS = GET,POST,PUT,DELETE,OPTIONS
CORS_ALLOW_HEADERS = Origin,X-Requested-With,Content-Type,Accept,Authorization
# CSP
CSP_DIRECTIVES="default-src 'self' http://localhost:4200; script-src 'self' 'unsafe-inline' 'unsafe-eval' http://localhost:4200; style-src 'self' 'unsafe-inline' http://localhost:4200; img-src 'self' data:; connect-src 'self' http://localhost:4200; font-src 'self' http://localhost:4200; frame-src 'self'; object-src 'none'"
# SESSION Secret
SESSION_SECRET = secret
SESSION_LIMIT = 1
# API KEY
SEND_GRID_API_KEY = API_KEY
# SENDGRID
SENDGRID_TEMPLATE_REGISTER_EMAIL = TEMPLATE_ID

View File

@ -4,7 +4,6 @@ import {
UnauthorizedException, UnauthorizedException,
} from '@nestjs/common'; } from '@nestjs/common';
import { UserCredentials } from 'src/entities'; import { UserCredentials } from 'src/entities';
import { AuthEmailService } from 'src/modules/sendgrid-module/services/auth.mail.service';
import { SessionService } from 'src/modules/session/services/session.service'; import { SessionService } from 'src/modules/session/services/session.service';
import { EncryptionService, SuccessDto } from 'src/shared'; import { EncryptionService, SuccessDto } from 'src/shared';
import { import {
@ -13,6 +12,7 @@ import {
InternalServerErrorException, InternalServerErrorException,
} from 'src/shared/exceptions'; } from 'src/shared/exceptions';
import { PasswordConfirmationMailService } from '../../sendgrid-module/services/password-confirmation.mail.service';
import { UserDataRepository } from '../../user-module/repositories/user-data.repository'; import { UserDataRepository } from '../../user-module/repositories/user-data.repository';
import { EmailVerificationService } from '../../verify-module/services/email-verification.service'; import { EmailVerificationService } from '../../verify-module/services/email-verification.service';
import { import {
@ -27,7 +27,7 @@ export class AuthService {
public constructor( public constructor(
private readonly userCredentialsRepository: UserCredentialsRepository, private readonly userCredentialsRepository: UserCredentialsRepository,
private readonly userDataRepository: UserDataRepository, private readonly userDataRepository: UserDataRepository,
private readonly authEmailService: AuthEmailService, private readonly passwordConfirmationMailService: PasswordConfirmationMailService,
private readonly emailVerificationService: EmailVerificationService, private readonly emailVerificationService: EmailVerificationService,
private readonly sessionService: SessionService private readonly sessionService: SessionService
) {} ) {}
@ -50,7 +50,10 @@ export class AuthService {
); );
// TODO: Add OTP or 2FA here as an additional security measure // TODO: Add OTP or 2FA here as an additional security measure
await this.authEmailService.sendLoginLinkEmail(magiclink.email, token); await this.passwordConfirmationMailService.sendLoginLinkEmail(
magiclink.email,
token
);
} else { } else {
const token = const token =
await this.emailVerificationService.generateEmailVerificationTokenForMagicLink( await this.emailVerificationService.generateEmailVerificationTokenForMagicLink(
@ -58,7 +61,7 @@ export class AuthService {
userAgent userAgent
); );
await this.authEmailService.sendRegistrationLinkEmail( await this.passwordConfirmationMailService.sendRegistrationLinkEmail(
magiclink.email, magiclink.email,
token token
); );

View File

@ -1,7 +1,7 @@
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config'; import { ConfigModule, ConfigService } from '@nestjs/config';
import { AuthEmailService } from './services/auth.mail.service'; import { PasswordConfirmationMailService } from './services/password-confirmation.mail.service';
import { TemplateConfigService } from './services/template-config.service'; import { TemplateConfigService } from './services/template-config.service';
@Module({ @Module({
@ -13,10 +13,10 @@ import { TemplateConfigService } from './services/template-config.service';
configService.get<string>('SEND_GRID_API_KEY'), configService.get<string>('SEND_GRID_API_KEY'),
inject: [ConfigService], inject: [ConfigService],
}, },
AuthEmailService, PasswordConfirmationMailService,
TemplateConfigService, TemplateConfigService,
], ],
controllers: [], controllers: [],
exports: [AuthEmailService], exports: [PasswordConfirmationMailService],
}) })
export class SendgridModule {} export class SendgridModule {}

View File

@ -7,7 +7,9 @@ import { BaseMailService } from './base.mail.service';
import { TemplateConfigService } from './template-config.service'; import { TemplateConfigService } from './template-config.service';
@Injectable() @Injectable()
export class AuthEmailService extends BaseMailService { export class PasswordConfirmationMailService extends BaseMailService {
private readonly PASSWORD_CONFIRMATION_EMAIL: string =
'PASSWORD_CONFIRMATION_EMAIL';
private readonly REGISTER_EMAIL: string = 'REGISTER_EMAIL'; private readonly REGISTER_EMAIL: string = 'REGISTER_EMAIL';
public constructor( public constructor(
@ -18,6 +20,29 @@ export class AuthEmailService extends BaseMailService {
super(sendGridApiKey); super(sendGridApiKey);
} }
public async sendPasswordConfirmationMail(
to: string,
verificationToken: string
): Promise<void> {
const templateId: string = this.templateConfigService.getTemplateId(
this.PASSWORD_CONFIRMATION_EMAIL
);
const token = `${verificationToken}|${UriEncoderService.encodeBase64(to)}`;
const mailoptions: SendGridMailApi.MailDataRequired = {
to,
from: { email: 'info@igor-propisnov.com', name: 'Ticket App' },
templateId: templateId,
dynamicTemplateData: {
name: 'Mara',
buttonUrl: `${this.configService.get<string>('APP_URL')}/verify/?token=${token}`,
},
};
await this.sendMail(mailoptions);
}
public async sendLoginLinkEmail( public async sendLoginLinkEmail(
to: string, to: string,
loginToken: string loginToken: string