【问题标题】:Nestjs, can't verify jwtNestjs,无法验证 jwt
【发布时间】:2021-11-03 11:00:18
【问题描述】:

我在前端发送请求,它返回 401 Unathorized,当我在控制器上 console.log(headers) 时,没有保护 x-access-token 存在,当我删除保护时一切正常,图像 url 被发送回前端。

const response = await axios
          .get(
            '/auth/avatar',
            {
              headers: {
                'x-access-token': sessionStorage.getItem('token')
              },
              params: {
                username: sessionStorage.getItem('username')
              }
            }
          )

        console.log(response.data);

/auth 控制器上

@Get('/avatar')
  @UseGuards(AuthGuard('jwt'))
  getAvatar(
    @Query('username') username: string,
  ): Promise<string> {
    return this.authService.getAvatar(username);
  }

服务:

getAvatar(username: string): Promise<string> {
    return this.usersRepository.getAvatarUrl(username);
  }

存储库:

async getAvatarUrl(username: string): Promise<string> {
    const user = await this.findOne({ where: { username } });
    return user.documentLocation;
  }

jwt-策略

import { Injectable, UnauthorizedException } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { PassportStrategy } from '@nestjs/passport';
import { InjectRepository } from '@nestjs/typeorm';
import { ExtractJwt, Strategy } from 'passport-jwt';
import { JwtPayload } from './jwt-payload.interface';
import { User } from './user.entity';
import { UsersRepository } from './users.repository';

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor(
    @InjectRepository(UsersRepository)
    private usersRepository: UsersRepository,
    private configService: ConfigService,
  ) {
    super({
      secretOrKey: configService.get('JWT_SECRET'),
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
    });
  }

  async validate(payload: JwtPayload): Promise<User> {
    const { username } = payload;
    const user: User = await this.usersRepository.findOne({ username });

    if (!user) {
      throw new UnauthorizedException();
    }

    return user;
  }
}

认证模块:

JwtModule.registerAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: async (configService: ConfigService) => ({
        secret: configService.get('JWT_SECRET'),
        signOptions: {
          expiresIn: 3600,
        },
      }),
    }),

【问题讨论】:

    标签: jwt passport.js nestjs passport-jwt nestjs-jwt


    【解决方案1】:

    你有错误的标题。在您的示例中,您使用 auth 标头获取:

    headers: {
        'x-access-token': sessionStorage.getItem('token')
    },
    

    但在jwt-stategy 中启用了使用承载令牌Authorization: Bearer ${token} 的身份验证。

    您可以通过更新 jwt-strategy 来修复它:

    import { Injectable, UnauthorizedException } from '@nestjs/common';
    import { ConfigService } from '@nestjs/config';
    import { PassportStrategy } from '@nestjs/passport';
    import { InjectRepository } from '@nestjs/typeorm';
    import { ExtractJwt, Strategy } from 'passport-jwt';
    import { JwtPayload } from './jwt-payload.interface';
    import { User } from './user.entity';
    import { UsersRepository } from './users.repository';
    
    @Injectable()
    export class JwtStrategy extends PassportStrategy(Strategy) {
      constructor(
        @InjectRepository(UsersRepository)
        private usersRepository: UsersRepository,
        private configService: ConfigService,
      ) {
        super({
          secretOrKey: configService.get('JWT_SECRET'),
          jwtFromRequest: ExtractJwt.fromHeader('x-auth-token'),
        });
      }
    
      async validate(payload: JwtPayload): Promise<User> {
        const { username } = payload;
        const user: User = await this.usersRepository.findOne({ username });
    
        if (!user) {
          throw new UnauthorizedException();
        }
    
        return user;
      }
    }
    
    

    或者:

    await axios
              .get(
                '/auth/avatar',
                {
                  headers: {
                    'Authorization': `Bearer ${sessionStorage.getItem('token')}`
                  },
                  params: {
                    username: sessionStorage.getItem('username')
                  }
                }
              )
    

    【讨论】:

    • 非常感谢这个有用的答案,它解决了我的问题
    猜你喜欢
    • 2019-03-28
    • 2021-02-09
    • 2022-07-05
    • 2019-09-13
    • 2021-03-02
    • 2017-03-08
    • 1970-01-01
    • 2023-03-25
    • 2021-11-25
    相关资源
    最近更新 更多