Вы не поверите, но я создаю 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 независимо от того, что я пытаюсь.
Есть идеи у кого-нибудь?