Внедрение / форсирование 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.