如何始终在没有后卫装饰的情况下验证JWT? (Nest.js +护照)

时间:2019-10-28 13:38:30

标签: node.js jwt graphql passport.js nestjs

我在项目中使用nest.js +护照+ jwt + graphql。

如果有令牌,则解码后的信息, 如果没有令牌,想要变得不确定。

始终必须有Guards才能接收已解码的令牌。

我可以选择性地产生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 :(得分:0)

您可以像这样应用全球警卫队

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);
}