2013-08-15 41 views
9

Tôi đang sử dụng khung công tác Express (3.0) trên node.js để định tuyến ứng dụng của mình.Express (node.js) bằng HTTPS và HTTP

Hầu hết đơn đăng ký của tôi sử dụng giao thức http tuy nhiên, chỉ có một tuyến đường cụ thể mà tôi muốn phân phối qua https. Đây là một phần của API của tôi chịu trách nhiệm đăng ký và xác thực người dùng.

ví dụ:

app.get('/connect', function(req, res){ 
// Must be on HTTPS, if not redirect to HTTPS 
}); 

app.post('/connect', function(req, res){ 
    // Must be on HTTPS 
}); 

app.get('/', function(req, res){ 
// Must be on HTTP 
}); 

app.get('/build', function(req, res){ 
// Must be on HTTP 
}); 

Làm sao người ta tạo điều kiện sử dụng cả hai trong cùng một ứng dụng? Tôi đang đấu tranh để tìm thấy bất kỳ ví dụ nào về điều này trong tự nhiên.

Trả lời

10

Đơn giản chỉ cần vượt qua của bạn app (mà thực sự là một chức năng yêu cầu xử lý) với createServer của httphttps.

var express = require('express') 
    , http = require('http') 
    , https = require('https') 
    , app = express(); 

http.createServer(app); 
https.createServer({ ... }, app); 

Cả hai yêu cầu HTTP và HTTPS đều được định tuyến thông qua cùng một ứng dụng Express. Trong trình xử lý tuyến đường, để kiểm tra xem yêu cầu đã được thực hiện qua https hay chưa, hãy sử dụng req.secure.

app.get('/route', function(req, res) { 
    if (req.secure) { 
     ... 
    } else { 
     res.redirect(301, 'https://example.com/route'); 
    } 
}); 

Là một mặt lưu ý, trí tuệ hiện đại coi trộn http/https các trang web không an toàn. Bạn có thể bảo vệ mật khẩu của người dùng bằng cách yêu cầu họ đăng nhập qua SSL, nhưng sau đó chuyển về http để yêu cầu tiếp theo, hãy làm cho nó trivial để kẻ tấn công lấy cắp cookie đăng nhập của người dùng.

Cân nhắc thực hiện tất cả yêu cầu của người dùng đã đăng nhập qua SSL.

+0

Trong trường hợp này, làm thế nào để bạn xử lý các trường hợp mà bạn cần ngăn xếp middleware khác nhau cho các yêu cầu an toàn và không an toàn? Giống như không an toàn, tôi không cần quản lý phiên làm việc trên cao mà cần bảo mật. – Chandu

+0

Cảm ơn điều này rất hữu ích, điều duy nhất ngăn tôi sử dụng HTTPS ở khắp mọi nơi là chi phí, đây là một ứng dụng web hành động chuyên sâu làm cho một số lượng lớn các cuộc gọi API và một cái gì đó như thế này trở nên rất đáng chú ý. Tôi nghĩ nếu người dùng đã xâm phạm hệ thống của riêng họ với phần mềm như vậy thì đó là điều tôi không có trách nhiệm bảo vệ họ. –

+0

@GeorgeReith: Bạn có thực sự đo lường chi phí không? Trên một hệ thống hiện đại, chi phí của SSL là <1% của CPU. Trên thực tế, với các tối ưu hóa như SPDY, bạn có thể thấy rằng kết nối được bảo mật SSL thực sự hoạt động * tốt hơn * so với HTTP thuần túy. Tôi sẵn sàng đặt cược rằng trong thực tế, bạn sẽ không thể nhận thấy ** bất kỳ sự khác biệt tiêu cực nào về hiệu suất. Ngoài ra, việc chiếm đoạt phiên (ăn cắp cookie đăng nhập) là một cuộc tấn công mạng thụ động; nó không liên quan gì đến một máy người dùng bị xâm nhập. (Đây chính là lý do tại sao Facebook là HTTPS bây giờ.) Trong năm 2013, không có lý do gì để không sử dụng tất cả SSL (và HSTS). – josh3736

1

Hãy thử phương pháp này.Tạo hai trình xử lý yêu cầu nhanh (app_http và app_https).

Gửi ứng dụng_http làm trình xử lý yêu cầu trong khi tạo máy chủ http (http.createServer (app_http)).

Chuyển ứng dụng_https làm trình xử lý yêu cầu trong khi tạo máy chủ https (https.createServer (tùy chọn, app_https)).

var express = require('express'), 
    http = require('http'), 
    https = require('https'); 

var app_http = express(); // this one to handle http request 

var app_https = express(); // this to handle httpS requests. 


app_https.get('/connect', function(req, res){ 
// Must be on HTTPS, if not redirect to HTTPS 
}); 

app_https.post('/connect', function(req, res){ 
    // Must be on HTTPS 
}); 

app_http.get('/', function(req, res){ 
// Must be on HTTP 
}); 

app_http.get('/build', function(req, res){ 
// Must be on HTTP 
}); 

    //call here http.createServer & https.createServer with needed details. 
+0

Cảm ơn nhưng tôi có tải phần mềm trung gian, tôi có phải chỉ định tất cả hai lần để nghe xử lý yêu cầu TLS không? –

+0

Có, chúng tôi cần tải phần mềm trung gian cho mỗi người trong số họ. Tôi sẽ làm như sau để giảm bớt nhiệm vụ, Viết một tiện ích có ứng dụng làm tham số và tải phần mềm trung gian. function loadMiddleware (ứng dụng) {app.use(), ....}. Nếu bạn có một chức năng như thế này thì tất cả về việc thực hiện hai cuộc gọi, một với app_http và một với app_https. Hy vọng điều này sẽ giúp – Chandu

+0

@Chandu: [Không bạn không.] (Http://stackoverflow.com/a/18255643/201952) – josh3736

1
const express = require('express'); 
const app = express(); 
const fs = require('fs'); 
const options = { 
    key:fs.readFileSync('./ssl/privkey.pem'), 
    cert:fs.readFileSync('./ssl/allchange.pem') 
}; 
const https = require('https').createServer(options,app); 
const http = require('http').createServer(app); 
app.get('/',(req,res) => { 
    (req.protocol == 'http') ? res.redirect('https://www.pkred.com/') : // code 
     // More code 
     // End code ; 
} 
app.get('/:id',(req,res) => { 
    (req.protocol == 'http') ? res.redirect(`https://www.pkred.com/${req.params.id}`) : // code 
     // More code 
     // End code ; 
} 
http.listen(8080,() => console.log('PORT :: 8080')); 
https.listen(4433,() => console.log('PORT :: 4433'));