4

我的 Feathers 应用程序需要能够具有两种 JWT 身份验证策略。对于users服务,我需要有,例如,all: [authenticate('carrier')]而不是all: [authenticate('jwt')]在我的钩子中。对于其余的服务,authenticate['jwt']是需要的。

为此,我在 authentication.js 中注册了一个自定义策略,CarrierStrategy如下所示:

module.exports = function auth(app) {
  const authentication = new AuthenticationService(app)

  // register all of the strategies with authentication service
  authentication.register('carrier', new CarrierStrategy())
  authentication.register('jwt', new JWTStrategy())

  // register the authentication service with your app
  app.use('/api/authentication', authentication)
}

在 config/default.json 中,我还注册了这个策略,如下所示:

authStrategies: ["carrier", "jwt"]

CarrierStrategy 需要使用一些自定义逻辑稍微不同地处理传入的 Authorization 标头。

当我使用 Postman 发送对该服务的请求时,即localhost:3030/users在标头中使用 JWT 令牌时,我收到以下错误。

Invalid authentication information (strategy not allowed in authStrategies)'

如果这是向应用程序添加自定义策略的正确方法,请指导我。

4

1 回答 1

1

我有一个类似的问题。我想要有状态和无状态的 JWT 身份验证。问题在于,如果您只是在 authentication.js 中执行此操作

authentication.register('jwt', new JWTStrategy());
authentication.register('jwt-stateless', new JWTStrategy());

然后,当您使用 JWT 令牌提交请求时,它将匹配其中一个令牌,您最终会在某处的某个服务中遇到问题。

我最终在 authentication.js 中创建了一个这样的自定义策略:

class StatelessJWTStrategy extends JWTStrategy {
  get configuration () {
    const authConfig = this.authentication.configuration;
    const config = super.configuration;

    return {
      ...config,
      entity: authConfig.entity,
      service: authConfig.service,
      header: 'Authorization',
      schemes: [ 'STATELESS' ]
    };
  }
}

这基本上是一个稍微修改过的JWTStrategy,它在 Authorization 标头中使用 STATELESS 而不是 Bearer 或 JWT。这不是一个很好的解决方案,但它有效。

然后我也在 authentication.js 中做了这个

authentication.register('jwt', new JWTStrategy());
authentication.register('jwt-stateless', new StatelessJWTStrategy());

然后你需要修改你的 config.json 文件。在身份验证部分添加:

"jwt-stateless": {
  "entity": null
},
"jwt": {
  "entity": "user",
  "service": "users"
},
"entity": "user",
"service": "users",
"authStrategies": [
  "jwt-stateless",
  "jwt",
  "local"
],

现在您应该能够在您的钩子中使用 jwt-stateless auth 机制,如下所示:

authenticate('jwt-stateless')

前往此处创建您的无状态 JWT。使用您的 config.json 中的颁发者和 aud 填写 iss 和受众详细信息,并将用户 ID 添加到子字段。在底部签名验证字段中从 config.json 弹出您的秘密,左侧的令牌应该进行身份验证。

于 2020-06-23T14:40:35.903 回答