node.js - Jag använder en passport-jwt autentiseringsstrategi i min nestJS-app (med authGuard), hur får jag tillgång till tokenpayloaden i min controller?
Jag försöker få tillgång till JWT-payloaden i en rutt som är skyddad av en AuthGuard.
Jag använder passport-jwt och token-payloaden är användarens e-post.
Jag skulle kunna uppnå detta genom att köra koden nedan:
import {
Controller,
Headers,
Post,
UseGuards,
} from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { AuthGuard } from '@nestjs/passport';
@Post()
@UseGuards(AuthGuard())
async create(@Headers() headers: any) {
Logger.log(this.jwtService.decode(headers.authorization.split(' ')[1]));
}
Jag vill veta om det finns ett bättre sätt att göra det?
Svar #1
Din JwtStrategy har en validate-metod. Här har du tillgång till JwtPayload. Returvärdet från denna metod kommer att bifogas till förfrågan (som standard under egenskapen user). Så du kan returnera vad du än behöver från payloaden här:
async validate(payload: JwtPayload) {
// You can fetch additional information if needed
const user = await this.userService.findUser(payload);
if (!user) {
throw new UnauthorizedException();
}
return {user, email: payload.email};
}
Och sedan får du åtkomst till det i din controller genom att injicera requesten:
@Post()
@UseGuards(AuthGuard())
async create(@Req() request) {
Logger.log(req.user.email);
}
Du kan göra detta mer bekvämt genom att skapa en egen dekoratör:
import { createParamDecorator } from '@nestjs/common';
export const User = createParamDecorator((data, req) => {
return req.user;
});
och sedan injicera @User istället för @Req.
