Как всегда проверять JWT без охраны декоратора? (Nest.js + паспорт) - PullRequest
0 голосов
/ 28 октября 2019

Я использую 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) {
		...
	}
})

1 Ответ

0 голосов
/ 04 ноября 2019

Вы можете применять глобальные охранники, как так

async function bootstrap(): Promise<void> {
    const app = await NestFactory.create(AppModule);

    const reflector = app.get(Reflector);
    app.useGlobalGuards(new GqlAuthGuard(reflector));

    await app.listen(process.env.PORT);
}
...