Я новичок в аутентификации.
Я разрабатываю приложение с помощью nodeJS, используя бэкэнд nestJS и механизм аутентификации стратегии Passport & JWT.
Это контроллер входа, который я нашел внекоторые репо на GitHub.Я реализовал это, и это работает.Я могу сделать ajax-вызов, аутентифицироваться и получить токен в качестве ответа.
auth.controller.ts:
import { Controller, Post, HttpStatus, HttpCode, Get, Response, Body, Param, Req, Res } from '@nestjs/common';
import { AuthService } from './auth.service';
import { UserService } from '../user/user.service';
import { User } from 'user/user.entity';
@Controller('auth')
export class AuthController {
constructor(private readonly authService: AuthService,
private readonly userService: UserService) {}
@Post('login')
async loginUser(@Response() res: any, @Body() body: User) {
if (!(body && body.email && body.password)) {
return res.status(HttpStatus.FORBIDDEN).json({ message: 'Email and password are required!' });
}
const user = await this.userService.findOneByEmail(body.email);
if (user) {
if (await this.userService.compareHash(body.password, user.password)) {
return res.status(HttpStatus.OK).json(await this.authService.createToken(user.email));
}
}
return res.status(HttpStatus.FORBIDDEN).json({ message: 'Email or password wrong!' });
}
}
Я пытаюсь понять, почему я должен вернуть токен вклиент?где я должен сохранить токен и как я смогу прочитать его?Я понимаю, что Passport.js - это промежуточное ПО, которое должно справляться со всем этим, но я не понимаю, как.
Сначала я думал, что должен сохранить его как файл cookie httpOnly, но сейчасТеперь я уверен, что если необходимо, или, возможно, паспорт делает что-то подобное "для меня".
Вот еще немного кода:
auth.module.ts
import { Module, MiddlewareConsumer, forwardRef } from '@nestjs/common';
import { JwtModule } from '@nestjs/jwt';
import { AuthService } from './auth.service';
import { JwtStrategy } from './jwt.strategy';
import { UserModule } from '../user/user.module';
import { PassportModule } from '@nestjs/passport';
import { AuthController } from '../auth/auth.controller';
import { PatientModule } from '../patient/patient.module'
@Module({
imports: [
PassportModule.register({ defaultStrategy: 'jwt' }),
JwtModule.register({
secret: 'secretKey',
signOptions: {
expiresIn: 3600,
},
}),
UserModule,
PatientModule
],
controllers: [AuthController],
providers: [AuthService, JwtStrategy],
exports: [AuthService],
})
export class AuthModule {}
auth.service.ts
import { Injectable } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { JwtPayload } from './jwt-payload.interface';
import { UserService } from '../user/user.service';
@Injectable()
export class AuthService {
constructor(private readonly jwtService: JwtService, private readonly userService: UserService,) {}
async createToken(email) {
const expiresIn = 3600
const user: JwtPayload = { email:email};
const token = await this.jwtService.sign(user);
return {
token,
expiresIn: expiresIn
};
}
async validateUser(payload: JwtPayload): Promise<any> {
return await this.userService.findOneByEmail(payload.email);
}
}
jwt.strategy.ts
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';
import { AuthService } from './auth.service';
import { JwtPayload } from './jwt-payload.interface';
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor(private readonly authService: AuthService) {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: 'secretKey',
});
}
async validate(payload: JwtPayload): Promise<boolean> {
const user = await this.authService.validateUser(payload);
if (!user) {
throw new UnauthorizedException();
}
return user;
}
}
Возможно, этот вопрос будет сочтен плохим, но я настоящий новичок в этом, яПытался прочитать документацию Passport.js и , вложив соответствующие документы , но ничего не нашел.