Внедрение / форсирование SSL для приложений LocomotiveJS (NodeJS / Express)

Теперь, когда MVC-фреймворки, такие как LocomotiveJS, доступны для NodeJS / Express, мне просто интересно, как можно было бы реализовать SSL для части приложения?

Например, приложение для электронной коммерции.

Мне нужны все контроллеры /checkout для принудительного использования SSL.

Я читал учебные пособия, подобные этому, но не уверен, как реализовать это с помощью Locomotive, поскольку Express эффективно "упакован"?

2 ответа

Решение

В настоящее время SSL не поддерживается напрямую в Locomotive, но в ближайшее время, согласно этой публикации в группах Google в апреле, Джаред Хэнсон, создатель Locomotive.

В настоящее время я всегда ставил Locomotive за прокси, который завершает SSL. Но я добавлю опцию командной строки для этого в ближайшее время, для прямой поддержки.

Тем не менее, если вы хотите полностью основанное на узле решение без использования прокси, то на данный момент вам нужно отредактировать экземпляр Express в Locomotive. Я проверил ниже, и это работает хорошо.

На момент написания npm install locomotive использует Express 2.x, хотя последняя версия на github с тех пор была обновлена ​​для использования Express 3.x.

Если вы используете локомотив с Express 2.x, то я думаю, что вам нужно редактировать /locomotive/lib/locomotive/index.jsвокруг линии 180, чтобы выглядеть примерно так:

var sslOptions = {
    cert : fs.readFileSync('/path/to/your/ssl-cert/dev.crt')
  , key  : fs.readFileSync('/path/to/your/ssl-key/dev.key')
};

var self = this
  , server = express.createServer(sslOptions)
  , entry;

Кроме того, вы, вероятно, все равно захотите прослушать HTTP и перенаправить весь трафик на HTTPS. Придерживаясь решения на основе всех узлов, вы можете просто запустить другой сервер Express в конце /locomotive/lib/locomotive/cli/server.js который перенаправляет весь свой трафик на HTTPS, например

    ...
    debug('booting app at %s in %s environment', dir, env);
    locomotive.boot(dir, env, function(err, server) {
    if (err) { throw err; }
    server.listen(port, address, function() {
      var addr = this.address();
      debug('listening on %s:%d', addr.address, addr.port);
    });

    // add an http server and redirect all request to https
    var httpServer = require('express').createServer();
    httpServer.all('*', function(req, res) {
      res.redirect('https://' + address + ':' + port + req.url);
    });
    httpServer.listen(80); // probably change based on NODE_ENV
  });
}

Наконец, запустите сервер:

$ lcm server -p 443 # again, probably use different port in development

Все эти платформы основаны на Express, который основан на Connect, который имеет поддержку HTTPS.

В любом случае, в реальной жизни вам может понадобиться прокси-сервер nginx или другой, который все равно будет обрабатывать https.

Другие вопросы по тегам