typescript - Mengapa server saya yang berbasis nestjs menggunakan Passport selalu mengembalikan 401 untuk endpoint saya, bahkan ketika Token JWT yang valid ada?
Kamu tidak akan percaya ini, tapi aku sedang membangun API untuk server Todo! Hore!
Saya menggunakan Nestjs, Auth0, dan Passport untuk melakukan autentikasi saya. Saya telah memverifikasi bahwa klien mengirimkan token yang valid.
Saya juga sedang stres karena sepertinya saya tidak bisa membuat controller /todo mengembalikan apa pun selain error 401.
Saya telah melakukan pemeriksaan yang semestinya di Google, tetapi sayangnya, tidak ada yang tampaknya berhasil.
Jadi, ini adalah Strategi JWT saya:
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);
}
}
Berikut adalah pengontrol todo saya:
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);
}
}
Jika Anda tertarik, pandangan lengkap tentang proyek ini dapat ditemukan di sini:
https://github.com/NickHodges/nestjstodoserver
Panggilan ke http:/localhost:3000/todos mengembalikan 401 tidak peduli apa yang saya coba.
Ada ide dari siapa pun?