Hapi认证方案:设置自定义header

Hapi authentication scheme: Set custom header

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

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

如何将我的自定义 header 传递给客户?

最小代码:

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')
};

解决方案是在插件数据中保存 header 并添加一个 response 函数,该函数在身份验证后调用,可用于将 header 添加到响应。

更新后的代码:

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')
};