Feathers身份验证是否还需要对应用程序内部服务调用进行身份验证(以及如何解决)?

时间:2017-09-14 22:24:06

标签: express passport.js feathersjs

我正在构建一个身份验证后面的FeathersJS服务,非常类似于FeathersJS演示聊天应用程序中的消息服务:https://github.com/feathersjs/feathers-chat/

此外,我想定义一个事件监听器,它应该将收到的消息存储到应用程序的消息服务中,并调用所有必要的挂钩来通知客户端应用程序。

这是我目前的做法:

module.exports = function () {
  const app = this;
  const Model = createModel(app);
  const paginate = app.get('paginate');

  const options = {
    name: 'messages',
    Model,
    paginate
  };

  app.use('/messages', createService(options));

  const service = app.service('messages');
  service.hooks(hooks);

  const sender = new MyExternalMessageSender();
  sender.on('message', (msg) => {
    service.create(msg, {user: {_id: 0}}).then(result => console.log(result));
  });

  if (service.filter) {
    service.filter(filters);
  }
};

这有时可以正常工作,有时只要通知MyExternalMessageSender并尝试调用邮件服务的create方法,它就会随机导致错误。

NotAuthenticated: No auth token
 at Error.NotAuthenticated (projects\feathers-chat\node_modules\feathers-errors\lib\index.js:100:17)
 at projects\feathers-chat\node_modules\feathers-authentication\lib\hooks\authenticate.js:102:31

如果我的应用程序本身不需要使用JWT,如何以正确的方式存储消息?

感谢您的支持!

1 个答案:

答案 0 :(得分:1)

我不确定MyExternalMessageSender是做什么的,但默认情况下在内部服务调用中跳过身份验证 。如果是内部服务,则由params.provider设置确定。因此,如果您将hook.params从外部呼叫(其中provider通常设置为restsocketio)传递到后续服务呼叫,则认证将运行(因为它认为它是外部呼叫)。

这可以通过在传递原始参数之前删除provider属性来避免,例如与Lodash _.omit

myservice.find(_.omit(params, 'provider'))