Skip to content
Snippets Groups Projects
Unverified Commit 14524120 authored by Denis's avatar Denis Committed by GitHub
Browse files

Merge pull request #6 from ivanalglave/login

feat: added login to people
parents b64f7ddf d4bdf5cc
No related branches found
No related tags found
No related merge requests found
...@@ -3,6 +3,7 @@ import { MongooseModule } from '@nestjs/mongoose'; ...@@ -3,6 +3,7 @@ import { MongooseModule } from '@nestjs/mongoose';
import config from './config'; import config from './config';
import { PeopleModule } from './people/people.module'; import { PeopleModule } from './people/people.module';
import { GroupsModule } from './groups/groups.module'; import { GroupsModule } from './groups/groups.module';
import { LoginModule } from './login/login.module';
import { InternshipsModule } from './internships/internships.module'; import { InternshipsModule } from './internships/internships.module';
@Module({ @Module({
...@@ -11,6 +12,8 @@ import { InternshipsModule } from './internships/internships.module'; ...@@ -11,6 +12,8 @@ import { InternshipsModule } from './internships/internships.module';
GroupsModule, GroupsModule,
InternshipsModule, InternshipsModule,
MongooseModule.forRoot(config.mongodb.uri), MongooseModule.forRoot(config.mongodb.uri),
LoginModule
], ],
}) })
export class AppModule {} export class AppModule {}
export const jwtConstants = {
secret: 'secretKey',
}
\ No newline at end of file
import { PassportStrategy } from "@nestjs/passport";
import { ExtractJwt, Strategy } from "passport-jwt";
import { jwtConstants } from '../constants';
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor() {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: jwtConstants.secret
})
}
async validate(payload: any) {
return {userId: payload.sub, email: payload.email}
}
}
\ No newline at end of file
import { Injectable, UnauthorizedException } from "@nestjs/common";
import { PassportStrategy } from "@nestjs/passport";
import { Strategy } from "passport-local";
import { LoginService } from "./login.service";
@Injectable()
export class LocalStrategy extends PassportStrategy(Strategy) {
constructor(private loginService: LoginService) {
super();
}
async validate(username: string, password: string): Promise<any> {
const user = await this.loginService.validateUser(username, password);
if (!user) {
throw new UnauthorizedException();
}
return user;
}
}
\ No newline at end of file
import { Controller, Post, Request, UseGuards } from '@nestjs/common';
import { Body } from '@nestjs/common/decorators/http/route-params.decorator';
import { AuthGuard } from '@nestjs/passport';
import { Login } from 'src/types/login';
import { LoginService } from './login.service';
@Controller('login')
export class LoginController {
constructor(private loginService: LoginService) {}
// @UseGuards(AuthGuard('local'))
@Post()
async login(@Body() req: Login) {
console.log('controller ' + req.email + req.passwordHash);
return this.loginService.login(req);
}
}
import { Module } from '@nestjs/common';
import { JwtModule } from '@nestjs/jwt';
import { PassportModule } from '@nestjs/passport';
import { PeopleModule } from 'src/people/people.module';
import { LoginService } from './login.service';
import { LoginController } from './login.controller';
import { jwtConstants } from '../constants';
// import { PeopleService } from 'src/people/people.service';
import { LocalStrategy } from './local.strategy';
import { JwtStrategy } from './jwt.strategy';
@Module({
imports: [
PeopleModule,
PassportModule,
JwtModule.register({
secret: jwtConstants.secret,
signOptions: { expiresIn: '300s' },
}),
],
controllers: [LoginController],
providers: [LoginService, LocalStrategy, JwtStrategy],
exports: [LoginService],
})
export class LoginModule {}
import { Injectable } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { PeopleService } from 'src/people/people.service';
@Injectable()
export class LoginService {
constructor(
private peopleService: PeopleService,
private jwtService: JwtService,
) {}
async validateUser(username: string, pass: string): Promise<any> {
const user = await this.peopleService.login(username, pass);
if (user && user.passwordHash == pass) {
const { passwordHash, ...result } = user;
return result;
}
return null;
}
async login(user: any) {
const req = await this.validateUser(user.email, user.passwordHash);
if(req != null) {
const payload = { email: user.email, sub: user.userId };
return {
access_token: this.jwtService.sign(payload),
};
}
}
}
...@@ -17,6 +17,15 @@ export class PeopleDao { ...@@ -17,6 +17,15 @@ export class PeopleDao {
private readonly _peopleModel: Model<People>, private readonly _peopleModel: Model<People>,
) {} ) {}
login = (email: string, password: string): Promise<People | void> =>
new Promise((resolve, reject) => {
this._peopleModel.findOne({email : email, passwordHash : password}, (err, value) => {
if (err) reject(err.message);
if (!value) reject(new NotFoundException('Email or password is incorrect!'));
resolve(value);
});
});
find = (): Promise<People[]> => find = (): Promise<People[]> =>
new Promise((resolve, reject) => { new Promise((resolve, reject) => {
this._peopleModel.find({}, {}, {}, (err, value) => { this._peopleModel.find({}, {}, {}, (err, value) => {
......
...@@ -7,6 +7,7 @@ import { ...@@ -7,6 +7,7 @@ import {
Param, Param,
Body, Body,
UseInterceptors, UseInterceptors,
UseGuards
} from '@nestjs/common'; } from '@nestjs/common';
import { CreatePeopleDto } from './dto/create-people.dto'; import { CreatePeopleDto } from './dto/create-people.dto';
import { UpdatePeopleDto } from './dto/update-people.dto'; import { UpdatePeopleDto } from './dto/update-people.dto';
...@@ -15,16 +16,26 @@ import { HttpInterceptor } from '../interceptors/http.interceptor'; ...@@ -15,16 +16,26 @@ import { HttpInterceptor } from '../interceptors/http.interceptor';
// import { UpdatePeopleDto } from './dto/update-people.dto'; // import { UpdatePeopleDto } from './dto/update-people.dto';
import { PeopleEntity } from './entities/people.entity'; import { PeopleEntity } from './entities/people.entity';
import { PeopleService } from './people.service'; import { PeopleService } from './people.service';
import { AuthGuard } from '@nestjs/passport';
interface Login {
email: string;
password: string;
}
@Controller('people') @Controller('people')
@UseInterceptors(HttpInterceptor) @UseInterceptors(HttpInterceptor)
export class PeopleController { export class PeopleController {
constructor(private readonly _peopleService: PeopleService) {} constructor(private readonly _peopleService: PeopleService) {}
@UseGuards(AuthGuard('jwt'))
@Get() @Get()
findAll(): Promise<PeopleEntity[] | void> { findAll(): Promise<PeopleEntity[] | void> {
return this._peopleService.findAll(); return this._peopleService.findAll();
} }
@UseGuards(AuthGuard('jwt'))
@Get(':id') @Get(':id')
findOne(@Param() params: { id: string }): Promise<PeopleEntity | void> { findOne(@Param() params: { id: string }): Promise<PeopleEntity | void> {
return this._peopleService.findOne(params.id); return this._peopleService.findOne(params.id);
......
...@@ -6,11 +6,11 @@ import { PeopleService } from './people.service'; ...@@ -6,11 +6,11 @@ import { PeopleService } from './people.service';
import { People, PeopleSchema } from './schemas/people.schema'; import { People, PeopleSchema } from './schemas/people.schema';
@Module({ @Module({
imports: [ imports: [
MongooseModule.forFeature([{ name: People.name, schema: PeopleSchema }]), MongooseModule.forFeature([{ name: People.name, schema: PeopleSchema }]),
], ],
controllers: [PeopleController], controllers: [PeopleController],
providers: [PeopleService, PeopleDao, Logger], providers: [PeopleService, PeopleDao, Logger],
}) exports: [PeopleService],
})
export class PeopleModule {} export class PeopleModule {}
\ No newline at end of file
...@@ -4,10 +4,16 @@ import { CreatePeopleDto } from './dto/create-people.dto'; ...@@ -4,10 +4,16 @@ import { CreatePeopleDto } from './dto/create-people.dto';
import { UpdatePeopleDto } from './dto/update-people.dto'; import { UpdatePeopleDto } from './dto/update-people.dto';
import { PeopleEntity } from './entities/people.entity'; import { PeopleEntity } from './entities/people.entity';
@Injectable() @Injectable()
export class PeopleService { export class PeopleService {
constructor(private readonly _peopleDao: PeopleDao) {} constructor(private readonly _peopleDao: PeopleDao) {}
login = (email: string, password: string): Promise<PeopleEntity | void> =>
this._peopleDao.login(email, password);
findAll = (): Promise<PeopleEntity[] | void> => this._peopleDao.find(); findAll = (): Promise<PeopleEntity[] | void> => this._peopleDao.find();
findOne = (id: string): Promise<PeopleEntity | void> => findOne = (id: string): Promise<PeopleEntity | void> =>
......
export interface Login {
email: string;
passwordHash: string;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment