Compare commits

...

2 Commits

9 changed files with 108 additions and 6 deletions

View File

@ -8,6 +8,7 @@ import { SecurityHeadersMiddleware } from './middleware/security-middleware/secu
import { HttpsRedirectMiddleware } from './middleware/https-middlware/https-redirect.middleware';
import { AuthModule } from './modules/auth-module/auth.module';
import { AccessTokenGuard } from './modules/auth-module/common/guards';
import { CorsMiddleware } from './middleware/cors-middleware/cors.middlware';
@Module({
imports: [
@ -24,7 +25,12 @@ export class AppModule {
configure(consumer: MiddlewareConsumer) {
consumer
// TODO: Redirect via Reverse Proxy all HTTP requests to HTTPS
.apply(CspMiddleware, SecurityHeadersMiddleware, HttpsRedirectMiddleware)
.apply(
CspMiddleware,
SecurityHeadersMiddleware,
HttpsRedirectMiddleware,
CorsMiddleware
)
.forRoutes({ path: '*', method: RequestMethod.ALL });
}
}

View File

@ -0,0 +1,36 @@
import { Injectable, NestMiddleware } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { Request, Response, NextFunction } from 'express';
@Injectable()
export class CorsMiddleware implements NestMiddleware {
constructor(private readonly configService: ConfigService) {}
public use(req: Request, res: Response, next: NextFunction): void {
if (this.configService.get<string>('NODE_ENV') === 'development') {
const allowedOrigin = this.configService.get<string>('CORS_ALLOW_ORIGIN');
if (req.headers.origin === allowedOrigin) {
res.header('Access-Control-Allow-Origin', allowedOrigin);
res.header(
'Access-Control-Allow-Methods',
this.configService.get<string>('CORS_ALLOW_METHODS')
);
res.header(
'Access-Control-Allow-Headers',
this.configService.get<string>('CORS_ALLOW_HEADERS')
);
if (req.method === 'OPTIONS') {
res.sendStatus(200);
} else {
next();
}
} else {
res.status(403).json({ message: 'Forbidden' });
}
} else {
next();
}
}
}

View File

@ -1,4 +1,5 @@
import { CommonModule } from '@angular/common';
import { HttpClientModule } from '@angular/common/http';
import {
ChangeDetectionStrategy,
Component,
@ -21,6 +22,8 @@ import { CheckboxModule } from 'primeng/checkbox';
import { InputTextModule } from 'primeng/inputtext';
import { PasswordModule } from 'primeng/password';
import { AuthService } from '../../shared/service';
import { LoginCredentials } from '../../shared/types';
import {
customEmailValidator,
customPasswordValidator,
@ -39,7 +42,9 @@ type AuthAction = 'register' | 'signup';
ButtonModule,
CheckboxModule,
PasswordModule,
HttpClientModule,
],
providers: [AuthService],
templateUrl: './register-root.component.html',
styleUrl: './register-root.component.scss',
changeDetection: ChangeDetectionStrategy.OnPush,
@ -53,7 +58,10 @@ export class RegisterRootComponent implements OnInit {
public passwordInvalid: WritableSignal<string | null> = signal(null);
public termsInvalid: WritableSignal<string | null> = signal(null);
public constructor(private readonly formBuilder: FormBuilder) {
public constructor(
private readonly formBuilder: FormBuilder,
private readonly authService: AuthService
) {
effect(() => {
if (this.form) {
if (this.isRegisterSignal()) {
@ -197,11 +205,11 @@ export class RegisterRootComponent implements OnInit {
}
}
private signin(data: unknown): void {
console.log(data);
private signin(logiCredentials: LoginCredentials): void {
this.authService.signin(logiCredentials);
}
private register(data: unknown): void {
console.log(data);
private register(logiCredentials: LoginCredentials): void {
this.authService.signup(logiCredentials);
}
}

View File

@ -0,0 +1,38 @@
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { environment } from '../../../environments/environment';
import { LoginCredentials, Tokens } from '../types';
@Injectable({
providedIn: 'root',
})
export class AuthService {
private isAuthenticated: boolean = false;
private access_token: string | null = null;
private refresh_token: string | null = null;
public constructor(
private readonly httpClient: HttpClient,
private readonly router: Router
) {}
public signin(credentials: LoginCredentials): void {
this.httpClient
.post<Tokens>(environment.api.base + '/api/auth/signin', credentials)
.subscribe((response: Tokens) => {
this.access_token = response.access_token;
this.refresh_token = response.refresh_token;
});
}
public signup(credentials: LoginCredentials): void {
this.httpClient
.post<Tokens>(environment.api.base + '/api/auth/signup', credentials)
.subscribe((response: Tokens) => {
this.access_token = response.access_token;
this.refresh_token = response.refresh_token;
});
}
}

View File

@ -0,0 +1 @@
export * from './auth.service';

View File

@ -0,0 +1,2 @@
export * from './login-credentials';
export * from './tokens';

View File

@ -0,0 +1,4 @@
export type LoginCredentials = {
email: string;
password: string;
};

View File

@ -0,0 +1,4 @@
export type Tokens = {
access_token: string;
refresh_token: string;
};

View File

@ -1,5 +1,8 @@
export const environment = {
production: false,
api: {
base: 'http://localhost:3000',
},
oauth: {
clinetId: 'app_FLXnxSBnnaKkXoYCgk3J62iA',
redirectUri: 'https://commonly-hot-airedale.ngrok-free.app/oauth',