Как я могу составить обработчик от Hapijs?

Мне нужно выполнить дополнительную аутентификацию в нескольких моих обработчиках. Есть ли способ сделать это компонуемым способом?

export async function handler(request) {
  const user = request.auth.credentials;
  const customer = FindCustomer(user);
  if (!customer) {
    throw Boom.forbidden('user is not a customer');
  }
  if (!customer.verified) {
    throw Boom.forbidden('customer not validated');
  }

  // actual handler logic
}

Есть ли способ обернуть это так, чтобы некоторые маршруты уже предоставляли клиента в объекте запроса?


person sheki    schedule 30.01.2016    source источник
comment
Какой плагин авторизации вы используете?   -  person ZeMoon    schedule 30.01.2016
comment
Хотя оба варианта ниже действительны, я просто проверил их в коде обработчика. Это кажется очевидным и прямым, serverExtensions, хотя и классные, не очень очевидны для других, читающих код.   -  person sheki    schedule 05.02.2016
comment
Я бы настроил стратегию аутентификации и потребовал ее через объект config.auth в маршрутах.   -  person manonthemat    schedule 08.02.2016


Ответы (2)


Вы можете использовать точки расширения в жизненном цикле запроса. В вашем случае точка расширения onPostAuth была бы идеальной.

server.ext('onPostAuth', function (request, reply){

  const user = request.auth.credentials;
  const customer = FindCustomer(user);
  if (!customer) {
    return reply (Boom.forbidden('user is not a customer'));
  }
  if (!customer.verified) {
    return reply(Boom.forbidden('customer not validated'));
  }
  reply.continue();
});
person ZeMoon    schedule 30.01.2016
comment
Это круто. Но как мне сделать это применимым только к нескольким маршрутам. - person sheki; 01.02.2016

В дополнение к ответу ZeMoon вы можете реализовать onPostAuth следующим образом:

server.ext('onPostAuth', function (request, reply) {

    if(request.route.settings.plugins.verifyCustomer) {

        const user = request.auth.credentials;
        const customer = FindCustomer(user);
        if (!customer) {
            return reply (Boom.forbidden('user is not a customer'));
        }
        if (!customer.verified) {
            return reply(Boom.forbidden('customer not validated'));
        }

    }

    reply.continue();
});

А затем добавьте в маршрут конфигурацию plugins.verifyCustomer:

server.route({
    method: 'get',
    path: '/test1',
    handler: function(request, reply) {

        // Handler logic here
    },
    config: {
        plugins: {
            verifyCustomer: true
        }
    }
});
person F. Gouveia    schedule 03.02.2016