Я использую nest.js + passport + jwt + graphql в проекте.
Если есть токен, то декодированную информацию нужно получить неопределенной, если токена нет.
Для получения декодированных токенов всегда должны быть охранники.
Можно ли выборочно генерировать ошибку 401?
@Module({
providers: [
JwtStrategy,
],
imports: [
PassportModule.register({ defaultStrategy: 'jwt' }),
JwtModule.register({
secret: 'hi',
signOptions: { expiresIn: '1d' },
}),
],
})
export class AuthModule {
}
export class GqlAuthGuard extends AuthGuard('jwt') {
getRequest(context: ExcutionContext) {
const ctx = GqlExecutionContext.create(context)
return ctx.getContext().req
}
}
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor() {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: config.jwt.secret,
})
}
validate(payload: JwtPayload): any {
return { user_id: +payload.user_id , username: payload.username }
}
}
@Resolver(() => Test)
export class TestResolver {
@UseGuards(GqlAuthGuard) // I want to get validated users without guards.
@Query(() => Test)
startTest(
@User() user: any, // req.user
) {
console.log(user)
}
}
Не знаю, возможно ли это, но мне нужен этот код.
app.use((req, res, next) => {
if (req.headers.token) { // optional
try {
req.user = verify(req.headers.token)
} catch (err) {
req.user = undefined
}
}
next()
})
app.get((req, res, next) => {
if (req.user) {
...
}
})