2013-08-15 27 views
9

Korzystam z frameworka express (3.0) na węźle node.js do kierowania moją aplikacją.Express (node.js) przy użyciu HTTPS i HTTP

Większość moich aplikacji korzysta z protokołu http, ale istnieje jedna konkretna trasa, którą chcę obsłużyć tylko przez https. To jest część mojego API, która jest odpowiedzialna za rejestrację i uwierzytelnianie użytkowników.

na przykład:

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

jaki sposób można ułatwić stosując zarówno w obrębie tej samej aplikacji? Próbuję znaleźć przykłady tego na wolności.

Odpowiedz

10

Wystarczy zdać app (który jest naprawdę funkcja żądania obsługi) do createServer z http i https.

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

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

Zarówno żądania HTTP, jak i HTTPS są przesyłane przez tę samą aplikację Express. W procedurze obsługi tras, aby sprawdzić, czy żądanie zostało wysłane przez https, użyj req.secure.

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

Na marginesie, nowoczesny mądrość uważa mieszane HTTP/HTTPS niepewna. Możesz zabezpieczyć hasło użytkownika, wymagając od niego zalogowania się przez SSL, ale następnie przełączenie z powrotem na http dla kolejnych żądań powoduje, że intruz staje się trivial celem kradzieży pliku cookie użytkownika.

Zastanów się, czy zgłoszenia wszystkie przez zalogowanych użytkowników przez SSL.

+0

W tym przypadku, jak radzisz sobie z przypadkami, w których potrzebujesz różnych stosów oprogramowania pośredniego do bezpiecznych i niezabezpieczonych żądań? Podobnie jak w przypadku niezabezpieczonego, nie potrzebuję narzutów związanych z zarządzaniem sesjami, ale potrzebuję bezpieczeństwa. – Chandu

+0

Dzięki temu jest bardzo przydatna, jedyną rzeczą, która powstrzymuje mnie od używania HTTPS wszędzie jest napowietrzenie, jest to intensywnie działająca aplikacja internetowa, która wykonuje wiele wywołań API i coś takiego staje się bardzo zauważalne. Myślę, że jeśli użytkownik naruszył własny system z takim oprogramowaniem, to jest to coś, czego nie jestem w stanie ich obronić. –

+0

@GeorgeReith: Czy faktycznie mierzyłeś narzut? W nowoczesnych systemach obciążenie SSL wynosi <1% CPU. W rzeczywistości, dzięki optymalizacji, takiej jak SPDY, może się okazać, że połączenie zabezpieczone za pomocą protokołu SSL faktycznie działa * lepiej * niż zwykły HTTP. Byłbym skłonny postawić zakład, że w rzeczywistości nie można zauważyć ** żadnej ** negatywnej różnicy w wydajności. Ponadto przechwytywanie sesji (kradzież plików cookie do logowania) jest pasywnym atakiem sieciowym; nie ma nic wspólnego ze skompromitowanym komputerem użytkownika. (Właśnie dlatego Facebook jest teraz wszystkim protokołem HTTPS.) W 2013 r. Nie ma wymówki, aby nie używać wszystkich protokołów SSL (i HSTS). – josh3736

1

Spróbuj tego podejścia.Utwórz dwa ekspresowe moduły obsługi żądań (app_http i app_https).

Przekaż app_http jako moduł obsługi żądań podczas tworzenia serwera http (http.createServer (app_http)).

Przekaż app_https jako moduł obsługi żądań podczas tworzenia serwera https (https.createServer (options, 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

Dzięki, ale mam ładunek oprogramowania pośredniego, czy naprawdę muszę podać to wszystko dwa razy tylko po to, aby słuchać poleceń TLS? –

+0

Tak, musimy załadować oprogramowanie pośrednie dla każdego z nich. Wykonałbym następujące czynności, aby ułatwić zadanie, Napisz narzędzie, które pobiera aplikację jako parametr i ładuje oprogramowanie pośrednie. function loadMiddleware (app) {app.use(), ....}. Jeśli masz taką funkcję, to wszystko polega na wykonywaniu dwóch połączeń, jeden z app_http i drugi z app_https. Mam nadzieję, że to pomoże – Chandu

+0

@Chandu: [Nie, nie.] (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')); 
Powiązane problemy