5

私は、nestJs に jwt 認証を実装しました。ただし、次の認証ヘッダーを使用して認証を試みるたびに:

Bearer <token> or JWT <token>

I got 401. これらは私の認証ファイルです

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') {
  constructor(private readonly authService: AuthService) {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      secretOrKey: `${process.env.SECRET}`,
    });
  }

  async validate(payload: Credentials) {
    const user: Account = await this.authService.validateAccount(payload);
    if (!user) {
      throw new UnauthorizedException();
    }
    return user;
  }
}


@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {
  canActivate(context: ExecutionContext) {
    return super.canActivate(context);
  }

  handleRequest(err, user, info) {
    if (err || !user) {
      throw err || new UnauthorizedException();
    }
    return user;
  }
}

そして、これは私の認証モジュールです

@Module({
  imports: [
    PassportModule.register({ defaultStrategy: 'jwt' }),
    JwtModule.register({
      secretOrPrivateKey: `${process.env.SECRET}`,
    }),
    AccountModule,
  ],
  providers: [AuthService, JwtStrategy],
  controllers: [AuthController],
  exports: [PassportModule, AuthService],
})
export class AuthModule {

}
4

5 に答える 5

4

validate有効な jwt トークンを渡した場合にのみ呼び出されます。トークンが別のシークレットで署名されているか、有効期限が切れている場合、validate呼び出されることはありません。有効なトークンがあることを確認してください。たとえば、jwt debuggerを使用してトークンを確認できます。

于 2019-04-25T23:08:48.357 に答える
2

同様の問題に直面していました.nestjsパスポートjwtモジュールはローカルマシンで完全に機能していましたが、ライブサーバーでは機能していませんでした. 半日調査した後、トークンヘッダーがライブサーバーに到達していないことがわかりました。その理由は、ライブサーバーでnginx(proxy_pass)を使用しており、ヘッダーフィールド名が「access_token」だったため、何らかの理由でnginxが削除したためです.

単純なグローバル ミドルウェアを作成し、ヘッダーでトークンを受信して​​いるかどうかを確認します。

それが誰かを助けることを願っています。

于 2019-12-03T13:10:41.060 に答える
0

パスポートとNestJSを使用した最小限の作業例を表示できます

https://github.com/leosuncin/nest-auth-example

コードとの主な違い:

@Module({
  imports: [
    PassportModule.register({ defaultStrategy: 'jwt' }), // I don't do this because I explicity call every stratategy
    JwtModule.register({
      secretOrPrivateKey: 'secretKey',
      signOptions: {
        expiresIn: '1d',
      },
    }),
    UserModule,
  ],
  providers: [AuthService, JwtStrategy],
  exports: [PassportModule, AuthService], // I don't do this
})

私は何も使用せずJwtAuthGuard、デフォルトのものを使用します。

于 2019-05-06T23:26:45.863 に答える