Дополнительный сервис аутентификации - PullRequest
1 голос
/ 30 сентября 2019

TL; DR. Проблема в том, как получить информацию о пользователе от jwt

. Я пытаюсь получить информацию о user из jwt, если она отправлена ​​назапрос, но я не хочу закрывать конечную точку только для зарегистрированных пользователей.

Я не хочу закрывать конечную точку с помощью хука authenticate, но я не знаю, как получить информацию user без нее.

Я использую локальнуюстратегия с jwt.

Ответы [ 3 ]

1 голос
/ 01 октября 2019

Даже если вы не используете хук аутентификации, информация аутентификации запроса (если есть) будет доступна в 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 .

0 голосов
/ 03 октября 2019

Метод с "try / catch" хорош, но есть другой способ, основанный на ловушках .

1) Создание пользовательских ловушек isAuth.js:

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

2) Исправлена ​​услуга hooks.js (app.service('/my-url').hooks(hooks)), в которой метод авторизации будет необязательным. ПРИМЕЧАНИЕ: если пользователь не авторизован, то в «params.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: {}
};
0 голосов
/ 01 октября 2019

Вы также можете сделать try / catch вокруг ловушки аутентификации, чтобы попытаться аутентифицировать маршрут, но не потерпеть неудачу из-за этого, например,

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

, в этом случае, если была действительнаятокен, у вас будет params.user и authenticated = true, иначе нет.

...