我在项目中使用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) {
...
}
})
答案 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);
}