可选的身份验证服务

时间:2019-09-30 20:42:59

标签: feathersjs feathers-authentication

TL; DR问题是如何从jwt

获取用户信息

如果正在根据请求发送user中的jwt信息,但我不想仅向已登录的用户关闭端点,我想从中获取authenticate的信息。

我不想使用user钩子来关闭端点,但是我不知道如何在没有它的情况下获取jwt信息。

我正在对CREATE TRIGGER id_adjust BEFORE INSERT on news_table FOR EACH ROW BEGIN IF (SELECT count(*) FROM news_table)=0 THEN SET NEW.id=999; ELSE SELECT min(id)-1 into NEW.id from news_table; ENDIF; END 使用本地策略。

4 个答案:

答案 0 :(得分:1)

即使您不使用身份验证挂钩,请求的身份验证信息(如果有)也将在params.authentication中可用。您可以在自己的钩子中做任何想做的事情:

module.exports = () => async context => {
  const { authentication } = context.params;
  // authentication will e.g. be { strategy: 'jwt', accessToken }

  // do whatever you like here including throwing errors
}

要获取用户信息允许匿名访问,请参见Anonymous Authentication cookbook recipe

答案 1 :(得分:0)

您还可以在身份验证钩子上执行try / catch,以尝试对路由进行身份验证,但不会因此而失败,例如

const tryAuth = async hook => {
  try {
    return await authenticate(hook); 
  } catch(err) {
    // do nothing?
    return hook;
  }
};

在这种情况下,如果有有效的令牌,则您将拥有params.userauthenticated = true,否则就没有。

答案 2 :(得分:0)

使用“尝试/捕获”的方法不错,但是还有另一种基于钩子的方法。

1)创建自定义钩子isAuth.js

module.exports = (context) => {
  return !!(context.params.headers.authorization
    && context.params.headers.authorization !== 'null'
    && context.params.headers.authorization !== '');
};

2)修复服务hooks.jsapp.service('/my-url').hooks(hooks)),其中方法授权是可选的。 注意:如果用户未被授权,则在“ params.user”对象中将缺少“ user”。

const { iff } = require('feathers-hooks-common');
const { authenticate } = require('@feathersjs/authentication').hooks;
const isAuth = require('isAuth');

module.exports = {
  before: {
    find: [iff(isAuth, authenticate('jwt'))],
  },
  after: {}
};

答案 3 :(得分:0)

这是它为我工作的唯一方法。

const { iff } = require('feathers-hooks-common');
const { authenticate } = require('@feathersjs/authentication').hooks;

module.exports = {
    before: {
        all: [iff(
            (({ params: { headers: { authorization }}}) => authorization),
            authenticate('jwt')
        )],
        find: [],
        get: [],
        create: [],
        update: [],
        patch: [],
        remove: []
    },

    after: {
        all: [],
        find: [],
        get: [],
        create: [],
        update: [],
        patch: [],
        remove: []
    },

    error: {
        all: [],
        find: [],
        get: [],
        create: [],
        update: [],
        patch: [],
        remove: []
    }
};

我刚刚验证了授权令牌已发送。