Что происходит с токеном после аутентификации в стратегии Passport.js и JWT? где он хранится (или где его хранить) и как его читать? - PullRequest
1 голос
/ 01 июля 2019

Я новичок в аутентификации.

Я разрабатываю приложение с помощью 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 и , вложив соответствующие документы , но ничего не нашел.

...