Compare commits
2 Commits
5d2b868a3d
...
0be5c36194
Author | SHA1 | Date |
---|---|---|
Igor Hrenowitsch Propisnov | 0be5c36194 | |
Igor Hrenowitsch Propisnov | c0accbbf34 |
|
@ -8,6 +8,7 @@ import { SecurityHeadersMiddleware } from './middleware/security-middleware/secu
|
||||||
import { HttpsRedirectMiddleware } from './middleware/https-middlware/https-redirect.middleware';
|
import { HttpsRedirectMiddleware } from './middleware/https-middlware/https-redirect.middleware';
|
||||||
import { AuthModule } from './modules/auth-module/auth.module';
|
import { AuthModule } from './modules/auth-module/auth.module';
|
||||||
import { AccessTokenGuard } from './modules/auth-module/common/guards';
|
import { AccessTokenGuard } from './modules/auth-module/common/guards';
|
||||||
|
import { CorsMiddleware } from './middleware/cors-middleware/cors.middlware';
|
||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
imports: [
|
imports: [
|
||||||
|
@ -24,7 +25,12 @@ export class AppModule {
|
||||||
configure(consumer: MiddlewareConsumer) {
|
configure(consumer: MiddlewareConsumer) {
|
||||||
consumer
|
consumer
|
||||||
// TODO: Redirect via Reverse Proxy all HTTP requests to HTTPS
|
// TODO: Redirect via Reverse Proxy all HTTP requests to HTTPS
|
||||||
.apply(CspMiddleware, SecurityHeadersMiddleware, HttpsRedirectMiddleware)
|
.apply(
|
||||||
|
CspMiddleware,
|
||||||
|
SecurityHeadersMiddleware,
|
||||||
|
HttpsRedirectMiddleware,
|
||||||
|
CorsMiddleware
|
||||||
|
)
|
||||||
.forRoutes({ path: '*', method: RequestMethod.ALL });
|
.forRoutes({ path: '*', method: RequestMethod.ALL });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,5 @@
|
||||||
import { CommonModule } from '@angular/common';
|
import { CommonModule } from '@angular/common';
|
||||||
|
import { HttpClientModule } from '@angular/common/http';
|
||||||
import {
|
import {
|
||||||
ChangeDetectionStrategy,
|
ChangeDetectionStrategy,
|
||||||
Component,
|
Component,
|
||||||
|
@ -21,6 +22,8 @@ import { CheckboxModule } from 'primeng/checkbox';
|
||||||
import { InputTextModule } from 'primeng/inputtext';
|
import { InputTextModule } from 'primeng/inputtext';
|
||||||
import { PasswordModule } from 'primeng/password';
|
import { PasswordModule } from 'primeng/password';
|
||||||
|
|
||||||
|
import { AuthService } from '../../shared/service';
|
||||||
|
import { LoginCredentials } from '../../shared/types';
|
||||||
import {
|
import {
|
||||||
customEmailValidator,
|
customEmailValidator,
|
||||||
customPasswordValidator,
|
customPasswordValidator,
|
||||||
|
@ -39,7 +42,9 @@ type AuthAction = 'register' | 'signup';
|
||||||
ButtonModule,
|
ButtonModule,
|
||||||
CheckboxModule,
|
CheckboxModule,
|
||||||
PasswordModule,
|
PasswordModule,
|
||||||
|
HttpClientModule,
|
||||||
],
|
],
|
||||||
|
providers: [AuthService],
|
||||||
templateUrl: './register-root.component.html',
|
templateUrl: './register-root.component.html',
|
||||||
styleUrl: './register-root.component.scss',
|
styleUrl: './register-root.component.scss',
|
||||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||||
|
@ -53,7 +58,10 @@ export class RegisterRootComponent implements OnInit {
|
||||||
public passwordInvalid: WritableSignal<string | null> = signal(null);
|
public passwordInvalid: WritableSignal<string | null> = signal(null);
|
||||||
public termsInvalid: 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(() => {
|
effect(() => {
|
||||||
if (this.form) {
|
if (this.form) {
|
||||||
if (this.isRegisterSignal()) {
|
if (this.isRegisterSignal()) {
|
||||||
|
@ -197,11 +205,11 @@ export class RegisterRootComponent implements OnInit {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private signin(data: unknown): void {
|
private signin(logiCredentials: LoginCredentials): void {
|
||||||
console.log(data);
|
this.authService.signin(logiCredentials);
|
||||||
}
|
}
|
||||||
|
|
||||||
private register(data: unknown): void {
|
private register(logiCredentials: LoginCredentials): void {
|
||||||
console.log(data);
|
this.authService.signup(logiCredentials);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
export * from './auth.service';
|
|
@ -0,0 +1,2 @@
|
||||||
|
export * from './login-credentials';
|
||||||
|
export * from './tokens';
|
|
@ -0,0 +1,4 @@
|
||||||
|
export type LoginCredentials = {
|
||||||
|
email: string;
|
||||||
|
password: string;
|
||||||
|
};
|
|
@ -0,0 +1,4 @@
|
||||||
|
export type Tokens = {
|
||||||
|
access_token: string;
|
||||||
|
refresh_token: string;
|
||||||
|
};
|
|
@ -1,5 +1,8 @@
|
||||||
export const environment = {
|
export const environment = {
|
||||||
production: false,
|
production: false,
|
||||||
|
api: {
|
||||||
|
base: 'http://localhost:3000',
|
||||||
|
},
|
||||||
oauth: {
|
oauth: {
|
||||||
clinetId: 'app_FLXnxSBnnaKkXoYCgk3J62iA',
|
clinetId: 'app_FLXnxSBnnaKkXoYCgk3J62iA',
|
||||||
redirectUri: 'https://commonly-hot-airedale.ngrok-free.app/oauth',
|
redirectUri: 'https://commonly-hot-airedale.ngrok-free.app/oauth',
|
||||||
|
|
Loading…
Reference in New Issue