Почему мой сервер nest js, использующий Passport, всегда возвращает 401 для моих конечных точек, даже если присутствует действительный токен JWT? - PullRequest
1 голос
/ 26 апреля 2020

Вы не поверите, но я создаю API для сервера Todo! Yay!

Я использую Nest js, Auth0 и Passport для своей аутентификации. Я подтвердил, что клиент отправляет действительный токен.

Я также выдергиваю волосы, потому что не могу заставить контроллер /todo когда-либо возвращать что-либо, кроме ошибки 401.

Я провел должную проверку в Google, но, увы, похоже, ничего не работает.

Итак, вот моя стратегия JWT:

import { passportJwtSecret } from 'jwks-rsa';
import { ExtractJwt, Strategy, VerifiedCallback } from 'passport-jwt';

import { Injectable, UnauthorizedException } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') {
  constructor() {
    super({
      secretOrKeyProvider: passportJwtSecret({
        cache: true,
        rateLimit: true,
        jwksRequestsPerMinute: 5,
        jwksUri: `https://${process.env.AUTH0_DOMAIN}/.well-known/jwks.json`,
      }),

      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      //jwtFromRequest: ExtractJwt.fromAuthHeaderWithScheme('jwt'),
      audience: 'http://localhost:3000',
      issuer: `https://${process.env.AUTH0_DOMAIN}/`,
    });
  }

  validate(payload: any, done: VerifiedCallback) {
    if (!payload) {
      console.log('DENIED!!!!!');
      done(new UnauthorizedException(), false); // 2
    }

    return done(null, payload);
  }
}

Вот мой контроллер todo:

import { ValidationPipe } from './../utils/validation.pipe';
import {
  Controller,
  Get,
  Param,
  Body,
  Post,
  Put,
  Delete,
  Query,
  ParseBoolPipe,
  UsePipes,
  UseGuards,
} from '@nestjs/common';
import { ToDosService } from './to-dos.service';
import { classToPlain } from 'class-transformer';
import { Todo } from '../models/todo.model';
import { ObjectID } from 'typeorm';
import { AuthGuard } from '@nestjs/passport';

@Controller('todos')
@UseGuards(AuthGuard('jwt'))  
export class ToDosController {
  constructor(private todosService: ToDosService) {}

  @Get()
  async getAllTodos() {
    const todosEntities = await this.todosService.getAllTodos();
    const todos = classToPlain(todosEntities);
    return todos;
  }

  @Get('complete')
  async getTodos(@Query('iscomplete', new ParseBoolPipe()) isComplete) {
    let todosEntities: Todo[];

    if (isComplete) {
      todosEntities = await this.todosService.getCompletedTodos();
    } else {
      todosEntities = await this.todosService.getIncompleteTodos();
    }
    const todos = classToPlain(todosEntities);
    return todos;
  }

  @Get(':id')
  async getTodo(@Param('id') id: ObjectID): Promise<Todo> {
    return this.todosService.getTodo(id);
  }

  @UsePipes(new ValidationPipe())
  @Post()
  async createTodo(@Body() todo: Todo) {
    return this.todosService.createTodo(todo);
  }

  @Put(':id')
  async updTodo(@Param('id') id: ObjectID, @Body() todo: Todo) {
    return this.todosService.updateTodo(id, todo);
  }

  @Delete(':id')
  async deleteTodo(@Param('id') id: ObjectID) {
    return this.todosService.deleteTodo(id);
  }
}

Если вы так склонны, полный взгляд на проект можно найти здесь:

https://github.com/NickHodges/nestjstodoserver

Звонок http:/localhost:3000/todos возвращает 401 независимо от того, что я пытаюсь.

Есть идеи у кого-нибудь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...