0

我已按照本指南尝试使 JWT 身份验证正常工作。

我唯一的区别是我将 JWT 令牌保留在 HttpOnly cookie 中,这意味着需要自定义提取器。

我找到了一个如何从 cookie 中提取 Token的示例。所以,唯一的区别是:

jwtFromRequest: ExtractJwt.fromExtractors([(req: Request) => {
  return req?.cookies?.access_token
}])

不幸的requndefined,没有明显的原因。

这就是我的auth.module.ts的样子:

@Module({
  imports: [
    PassportModule,
    JwtModule.register({
      secret: 'qweqweqweqeqwe',
      signOptions: { expiresIn: '20s' }
    })
  ],
  providers: [
    AuthService,
    AuthResolver,
    JwtAuthGuard,
    JwtStrategy
  ]
})
export class AuthModule { }

我还创建了一个策略文件jwt.stragegy.ts

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      jwtFromRequest: ExtractJwt.fromExtractors([(req: Request) => {
        return req?.cookies?.access_token
      }]),
      ignoreExpiration: false,
      secretOrKey: 'qweqweqweqeqwe',
    })
  }

  async validate(payload: any) {
    return { userId: payload.sub, username: payload.username }
  }
}

auth.guard.ts

@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {}

可能是 passport.js 库方面的错误吗?就像,@nestjs/passport 无法映射参数或其他东西......

4

2 回答 2

1

通过遵循文档,您应该能够获得请求。

import { ExecutionContext } from '@nestjs/common';
import { GqlExecutionContext } from '@nestjs/graphql';

@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {
  getRequest(context: ExecutionContext) {
    const ctx = GqlExecutionContext.create(context);
    return ctx.getContext().req;
  }
}
于 2021-02-17T08:17:41.590 回答
0

在我的场景中,导致payload.sub未定义的loginauth.service.

之前(不工作)

async login(user: any) {
    const payload = { apiKey: user.apiKey, sub: user.userId };
    const token = this.jwtService.sign(payload);

    return `Access token=${token};\n HttpOnly;\n Path=/;\n Max- 
    Age=${this.configService.get('jwtConstants.expirationTime')}`;
}

更改后(工作)

async login(user: any) {
    const payload = { apiKey: user._doc.apiKey, sub: user._doc._id };
    const token = this.jwtService.sign(payload);

    return `Access token=${token};\n HttpOnly;\n Path=/;\n Max-Ag
    e=${this.configService.get('jwtConstants.expirationTime')}`;
}
于 2021-12-07T13:18:17.417 回答