使用nestjs身份验证时身份验证失败

时间:2018-05-23 12:54:20

标签: typescript authentication jwt express-jwt nestjs

我正在尝试使用nestjs文档实现身份验证。 https://docs.nestjs.com/techniques/authentication

我正在实施JWT身份验证,并且在尝试访问正在进行身份验证的API时,即使在验证之前,我也会收到验证错误。有没有人遇到类似的问题。

@Get()
  @UseGuards(AuthGuard('jwt'))
  async findAll(): Promise<UserDto[]> {
    return this.userService.findAll();
  }

这条路线给了我UnAuthorized错误。我是Typescript和nestjs的新手

我的代码可以在我的GitHub仓库中找到。请告诉我出了什么问题。 https://github.com/shamnadps/TypeScript_Project/blob/master/src/user/user.controller.ts#L23

2 个答案:

答案 0 :(得分:1)

您的 - 轻微但严重 - 错误存在于您用于签署令牌的secretOrKey值中。您在 src/auth/jwt.strategy.ts src/auth/auth.service.ts 之间有不同的值。

src/auth/auth.service.ts
而不是:

async createToken() {
    const user: UserDto = { name: 'shamnad', phoneNumber: '12435' };
    return jwt.sign(user, 'secretkey'); // <== /!\ focus on this one /!\
}

使用此:

async createToken() {
        const user: UserDto = { name: 'shamnad', phoneNumber: '12435' };
        return jwt.sign(user, 'secretKey'); // <== /!\ focus on this one /!\
}

因为您使用 secretKey 来代表您的令牌,而不是 secretkey (请注意驼峰案例):

constructor(private readonly authService: AuthService) {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      secretOrKey: 'secretKey', // <== /!\ focus on this line /!\
    });
}

为避免此类问题,我建议您使用 process.env.<your-variable> ,而不是直接在字符串中手动设置配置。

src/auth/jwt.strategy.ts

中看起来像这样
constructor(private readonly authService: AuthService) {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      secretOrKey: process.env.SECRET
    });
}

并在src/auth/auth.service.ts中,像这样:

async createToken() {
    const user: UserDto = { name: 'shamnad', phoneNumber: '12435' };
    return jwt.sign(user, process.env.SECRET); // <== /!\ focus on this one /!\
}

最后,要设置环境变量,请根据您的操作系统执行以下命令:
- Mac OS:export SECRET=<your-secret-key>
- Windows:set SECRET=<your-secret-key>


我希望它有所帮助;)

答案 1 :(得分:0)

你是如何进入这条路线的?

您必须先创建令牌。

不知道这是否给你一个提示

enter image description here