将 NestJs Passport 配置提取到 npm 包中

问题描述

我一直在用 nestjs 开发微服务应用程序。我使用 Auth0 作为我的身份验证 * RBAC 提供者,尽管这些细节与这个问题无关。

为了便于论证,假设我有 2 个服务,一个 users 服务和 accounts 服务。假设我的身份验证发生在 users 服务中,但这两个服务都需要利用如下所示的身份验证保护。

import { AuthGuard } from '@nestjs/passport';
...
@UseGuards(AuthGuard('jwt'))
@Get()
findAll() {
  return this.userService.findAll();
}

如果我在使用它的服务中对通行证进行所有配置,它就可以工作。这是完整的配置。

auth.module.ts

import { Module } from '@nestjs/common';
import { PassportModule } from '@nestjs/passport';
import { JwtStrategy } from './jwt.strategy';

@Module({
  imports: [PassportModule.register({ defaultStrategy: 'jwt' })],providers: [JwtStrategy],exports: [PassportModule],})
export class AuthModule {}

jwt.strategy.ts

import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt,Strategy } from 'passport-jwt';
import { passportJwtSecret } from 'jwks-rsa';

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      secretorKeyProvider: passportJwtSecret({
        cache: true,rateLimit: true,jwksRequestsPerMinute: 5,jwksUri: `{AUTH0_ISSUER_URL}/.well-kNown/jwks.json`,}),jwtFromrequest: ExtractJwt.fromAuthHeaderAsBearerToken(),audience: {AUTH0_AUDIENCE},issuer: {AUTH0_ISSUER_URL},algorithms: ['RS256'],});
  }

  validate(payload: unkNown): unkNown {
    console.log('payload: ',payload);
    return payload;
  }
}

app.module.ts

import { Module } from '@nestjs/common';
import { AuthModule } from './auth/auth.module';
import { UserModule } from './users/users.module';
...
@Module({
  imports: [
    AuthModule,UserModule,],controllers: [...],providers: [...],})
export class AppModule {}

同样,这一切正常,如果在尝试访问端点时未登录,我会收到 401。但是,当我将 auth.module.tsjwt.strategy.ts 拉出到 npm 模块中并以完全相同的方式包含它时...我得到 500 并出现以下错误

[nest] 30616   - 06/08/2021,11:07:03 AM   [ExceptionsHandler] UnkNown authentication strategy "jwt" +2291212ms
Error: UnkNown authentication strategy "jwt"
    at attempt (/Users/me/projects/svc-users/node_modules/passport/lib/middleware/authenticate.js:190:39)
    at authenticate (/Users/me/projects/svc-users/node_modules/passport/lib/middleware/authenticate.js:367:7)
    at /Users/me/projects/svc-users/node_modules/@nestjs/passport/dist/auth.guard.js:87:3
    at new Promise (<anonymous>)
    at /Users/me/projects/svc-users/node_modules/@nestjs/passport/dist/auth.guard.js:79:83
    at MixinAuthGuard.<anonymous> (/Users/me/projects/svc-users/node_modules/@nestjs/passport/dist/auth.guard.js:48:36)
    at Generator.next (<anonymous>)
    at /Users/me/projects/svc-users/node_modules/@nestjs/passport/dist/auth.guard.js:20:71
    at new Promise (<anonymous>)
    at __awaiter (/Users/me/projects/svc-users/node_modules/@nestjs/passport/dist/auth.guard.js:16:12)

这是我用于私有 npm 模块的 package.json...

{
  "name": "@my-project/auth","version": "1.0.0","description": "nestJS npm package starter","author": "John Biundo <johnfbiundo@gmail.com>","license": "MIT","readmeFilename": "README.md","main": "dist/index.js","files": [
    "dist/**/*","*.md"
  ],"scripts": {
    "start:dev": "tsc -w","build": "tsc",...
  },"keywords": [
    "nestjs"
  ],"publishConfig": {
    "access": "public"
  },"repository": {
    "type": "git","url": "https://github.com/nestjsplus/nestjs-package-starter"
  },"bugs": "https://github.com/nestjsplus/nestjs-package-starter","peerDependencies": {
    "@nestjs/common": "^7.0.0"
  },"dependencies": {
    "@nestjs/passport": "^7.1.5","auth0": "^2.35.0","jwks-rsa": "^2.0.3","passport": "^0.4.1","passport-jwt": "^4.0.0"
  },"devDependencies": {
    "@nestjs/common": "^7.6.15","@nestjs/config": "^0.6.3","@nestjs/core": "^7.6.15","@nestjs/platform-express": "^7.6.15","@nestjs/testing": "^7.6.15","@types/express": "^4.17.11","@types/jest": "^26.0.22","@types/node": "^14.14.36","@types/supertest": "^2.0.10","@typescript-eslint/eslint-plugin": "^4.19.0","@typescript-eslint/parser": "^4.19.0","eslint": "^7.22.0","eslint-config-prettier": "^8.1.0","eslint-plugin-prettier": "^3.3.1","jest": "^26.6.3","prettier": "^2.2.1","reflect-Metadata": "^0.1.13","rxjs": "^7.0.1","supertest": "^6.1.3","ts-jest": "^26.5.4","ts-loader": "^8.0.18","ts-node": "^9.1.1","tsc-watch": "2.2.1","tsconfig-paths": "^3.9.0","tslint": "5.16.0","typescript": "^4.2.3"
  },"jest": {
    "modulefileExtensions": [
      "js","json","ts"
    ],"rootDir": "src","testRegex": ".*\\.spec\\.ts$","transform": {
      "^.+\\.(t|j)s$": "ts-jest"
    },"collectCoverageFrom": [
      "**/*.(t|j)s"
    ],"coverageDirectory": "../coverage","testEnvironment": "node"
  }
}

...最后,我将它保存为依赖项,供本地使用到我的 users 服务中。

"dependencies": {
    "@my-thing/auth": "../pkg-auth",...
}

任何帮助将不胜感激,似乎我只是错过了一些小事。提前致谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...