Hapi身份验证方案:设置自定义标头

时间:2015-04-15 10:04:23

标签: javascript authentication hapijs

我正在Hapi.js中实现身份验证方案。

在我的authenticate函数中,我验证了请求并想要设置自定义标头。但由于我必须使用reply.continue()完成身份验证功能,因此我无法将任何标头传递给响应。

如何将自定义标头传递给客户端?

最小代码:



var Boom = require('boom'),
  Hoek = require('hoek'),
  request = require('request');

exports.register = function(plugin, config, next) {
  plugin.auth.scheme('myScheme', function(server, options) {
    Hoek.assert(options, 'Missing auth strategy options');

    return {
      authenticate: function(req, reply) {
        request(
          'http://localhost/somewhere',
          function(error, response, body) {
            if (error) {
              return reply(null, null, Boom.unauthorized(null, 'myScheme'));
            }

            options.validateFunc(
              body,
              function(validateError, isValid, credentials) {
                if (validateError || !isValid) {
                  return reply(
                    Boom.unauthorized('Invalid cookie'),
                    null,
                    {credentials: credentials}
                  );
                }

                // I want to add a custom header here                
                //.header('my-header', 'my-header-content')

                return reply
                  .continue({
                    credentials: credentials || body
                  }));
              }
            );
          }
        );
      }
    };
  });

  next();
};

exports.register.attributes = {
  pkg: require('../package.json')
};




1 个答案:

答案 0 :(得分:1)

解决方案是在插件数据中保存标头并添加response函数,该函数在验证后调用,并可用于向响应添加标头。

更新的代码:



var Boom = require('boom'),
  Hoek = require('hoek'),
  request = require('request');

exports.register = function(plugin, config, next) {
  plugin.auth.scheme('myScheme', function(server, options) {
    Hoek.assert(options, 'Missing auth strategy options');

    return {
      // add headers to the response.
      response: function(request, reply) {
        var pluginData = request.plugins['myScheme'];

        if (pluginData && pluginData['my-header']) {
          request.response.header('my-header', pluginData['my-header']);
        }

        reply.continue();
      },
      authenticate: function(req, reply) {
        request(
          'http://localhost/somewhere',
          function(error, response, body) {
            if (error) {
              return reply(null, null, Boom.unauthorized(null, 'myScheme'));
            }

            options.validateFunc(
              body,
              function(validateError, isValid, credentials) {
                if (validateError || !isValid) {
                  return reply(
                    Boom.unauthorized('Invalid cookie'),
                    null,
                    {credentials: credentials}
                  );
                }

                // save header in the plugin data
                request.plugins['myScheme'] = {
                  'my-header': 'my-header-content'
                };
       
                return reply
                  .continue({
                    credentials: credentials || body
                  }));
              }
            );
          }
        );
      }
    };
  });

  next();
};

exports.register.attributes = {
  pkg: require('../package.json')
};