#jwt #nestjs #passport-local #nestjs-passport #nestjs-jwt
Вопрос:
Я пытаюсь проверить в функции проверки в jwt.strategy.ts, действителен ли токен или нет, Если токен аутентификации заголовка на предъявителя JWT недействителен, исключение выбрасывается в другом случае, возвращается полезная нагрузка JWT.Более конкретно, Passport создаст свойство «пользователь» для объекта экспресс-запроса HTTP и назначит все, что будет возвращено здесь, req.user
import { Injectable } from '@nestjs/common'; import { PassportStrategy } from '@nestjs/passport'; import { Strategy, ExtractJwt } from 'passport-jwt'; import * as dotenv from 'dotenv'; dotenv.config(); @Injectable() export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') { constructor() { super({ jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), ignoreException: true, secretOrKey: process.env.JWT_SECRET, }); } @param payload async validate(payload: any) { const isAuthorized = this.authConfig.roles.some((role) =gt; payload.role?.includes(role)); if(!isAuthorized) { Logger.error(`Unauthorized: Invalid role`); throw new UnauthorizedException(); } console.log('validate()',payload); return { userId: payload.sub, username: payload.username }; } }
jwt.стратегия.ts
import { Body, Controller, Post } from '@nestjs/common'; import { AuthDto } from './dtos/auth.dto'; import { AuthService } from './auth.service'; @Controller('auth') export class AuthController { constructor(private authService: AuthService) {} /** * API endpoint handler for user login * @param dto */ @Post('/login') login(@Body() dto: AuthDto) { console.log('hi') this.authService.login(dto) } }
auth.контроллер.ts
import { Module } from '@nestjs/common'; import { JwtModule } from '@nestjs/jwt'; import { AuthController } from './auth.controller'; import { AuthService } from './auth.service'; import { JwtStrategy } from './strategies/jwt.strategy'; import { MongooseModule } from '@nestjs/mongoose'; import { User, UserSchema } from '@sp/schemas'; import { UserService } from '../user/user.service'; import { UserController } from '../user/user.controller'; import * as dotenv from 'dotenv'; dotenv.config(); @Module({ imports: [ JwtModule.register({ secret: process.env.JWT_SECRET, signOptions: { expiresIn: '5m' }, }), MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]) ], controllers: [AuthController], providers: [AuthService, JwtStrategy, UserService], }) export class AuthModule {}
auth.module.ts
import { HttpException, Injectable, UnauthorizedException } from '@nestjs/common'; import { JwtService } from '@nestjs/jwt'; const jwt = require("jsonwebtoken"); import { AuthDto } from './dtos/auth.dto'; import { UserService } from '../user/user.service'; @Injectable() export class AuthService { constructor(private jwtService: JwtService, private Users: UserService) {} /** * Determines if the user credentials provided are correct * @param dto */ async login(dto: AuthDto) { this.Users.findByEmail(dto.email) .then((user)=gt;{ if(!user){ throw new HttpException("not autheroized",401) } else{ if(dto.password == user.password){ const payload = { sub: user.giuEmail ,username: user.name}; console.log(payload); console.log(this.jwtService.sign(payload)); return { access_token: this.jwtService.sign(payload), }; } } }) } }
auth.service.ts