2015-11-29 5 views
5

Korzystanie z lokalnego uwierzytelniania paszportowego, logowanie działa, klikam przycisk getStatus i działa, a następnie wylogowanie działa. Ale po wylogowaniu klikam BACK w przeglądarce, nadal może wyświetlać pełną treść getStatus. W logu konsoli isAuthenticated() nadal jest napisane "jesteś zalogowany". To jest uproszczony kod:Paszport jest uwierzytelniony() zawsze zwraca PRAWDA

var express = require('express'); 
var passport = require('passport'); 
var net  = require('net'); 
var bodyParser = require('body-parser'); 
var http  = require('http'); 
var multer  = require('multer'); 
var cp   = require('child_process'); 
var exec  = require('child_process').exec; 
var sys  = require('sys'); 
var path  = require('path'); 
var util  = require('util'); 
var session = require('express-session'); 

var crypto  = require('crypto'); 
var sqlite3 = require('sqlite3'); 

///////////////////////////////////////////////// 
var LocalStrategy = require('passport-local').Strategy; 
var db = new sqlite3.Database('./myPassword.db'); 

passport.use(new LocalStrategy(function(username, password, done) 
{ 
    console.log("step 2: Client sent you user: " + username + " password: " + password); 

    db.get('SELECT slat FROM users WHERE username = ?', username, function(err, row)         
    { 
     if (!row) return done(null, false); 
     console.log("step 4"); 

     db.get('SELECT username, id FROM users WHERE username = ? AND password = ?', 
       username, password, function(err, row) 
     { 
      console.log("step 6"); 

      if (!row) return done(null, false); 

      console.log("step 8"); 

      return done(null, row); 
     }); 
    }); 
})); 

passport.serializeUser(function(user, done) { 
    return done(null, user.id); 
}); 


passport.deserializeUser(function(id, done) { 
    db.get('SELECT id, username FROM users WHERE id = ?', id, function(err, row) 
    { 
     if (!row) 
      return done(null, false); 
     return done(null, row); 
    }); 
}); 

///////////////////////////////////////////////// 
var isAuthenticated = function(req, res, next) 
{ 
    //if (req.user.authenticated) 
    if (req.isAuthenticated()) { 
     console.log("Very good, you are logged in ..."); 
     return next(); 
    } 

    console.log("Sorry, you are NOT logged in yet ..."); 
    res.send(200); 
}; 

///////////////////////////////////////////////// 
var app = express(); 

///////////////////////////////////////////////// 
var server = http.createServer(app); 

///////////////////////////////////////////////// 
app.use(function(req, res, next) { 
    if (!req.user) { 
     console.log('Cannot display 1 ...'); 
     res.header('Cache-Control', 'private, no-cache, no-store, must-revalidate'); 
    } 
    console.log('Cannot display 2 ...'); 
    next(); 
}); 

app.use(express.static('../client/', {index: 'login.html'})); 
app.use(bodyParser()); 
app.use(session({ secret: 'my test cookie' })); 
app.use(passport.initialize()); 
app.use(passport.session()); 

app.post('/auth/login', passport.authenticate('local', 
{ 
    successRedirect: '/index.html#/uploads', 
    failureRedirect: '/login.html', 
})); 

app.get('/auth/logout', function(req, res) 
{ 
    console.log("logging out ......"); 
    req.session = null; 
    req.logout(); 
    res.send(200); 
}); 

app.get('/', isAuthenticated, function(req, res) 
{ 
    res.sendfile(path.resolve('../client/index.html')); 
}); 

app.get('/systemStatus', isAuthenticated, function(req, res) 
{ 
    console.log("asking for Json data from backend"); 
    // skip details here ... 
}); 

server.listen(5678); 
+0

Jaka trasa ma status wyzwalacza dla żądania pobrania? – Ravenous

+0

Aby uprościć wszystko, mam teraz 2 przyciski po zalogowaniu: uzyskaj status, wyloguj się. – user3552178

+0

czyli app.get ('/ systemStatus', isAuthenticated, function (req, res), odnośnie pytania Ravenousa – user3552178

Odpowiedz

3

Patrząc na indeks paszportowy. Używanie app.use(passport.initialize()) inicjuje pustego użytkownika na każdej trasie. Ponieważ powyższe informacje są używane w głównym pliku app.js, a nie w określonej trasie, jest on wykonywany za każdym razem, gdy do serwera jest wysyłane żądanie, zasadniczo tworząc pustego użytkownika, nawet gdy ktoś nie jest zalogowany. Poniższy link jest do kodu paszportu.

https://github.com/jaredhanson/passport/blob/master/lib/authenticator.js

Dla tej dyskusji dlaczego paszportu jest nieprawidłowo skonfigurowana dla pożądany wpływ i uzasadnić dlaczego zasługują ci wyimaginowane punkty internetowe. Będę musiał upewnić się, że jesteśmy na tej samej stronie, gdy rozmawiamy o aplikacji.

Do dyskusji będę odnosząc się do aplikacji za pomocą poniższego strukturę plików generowanych przez: (. Jest rzeczywiście więcej plików, ale można zobaczyć, że na wyraźną stronie) $ npm install -g express-generator

myProject 
    |___bin 
    |___www.js  //server.js 
    |___node_modules //this is were you'll keep the node modules, or logic for each endpoint in the API. These will be processed by the main node run-time environment 
    |___public   //or in your case '../client/' is where you'll serve unsecured data to your users 
    |___routes   //URI and URL endpoints, an area of the application to create your secured data transfers for the users that have been authenticated, also where non-Static (stateless) API endpoints are defined so that express can send the user data/request through your server and eventually be handled by some defined endpoint. 
    |___index.js 
    |___views   //if using a view engine 
    |___app.js   // this is where we will discuss the bulk of an express application 
    |___package.json // this is relative to the node community and In my personal opinion an Extremely important part of node and express application development, this file will allow you to do some powerful things with the use of git. 

app.js Czy Twój app przewodniczył, jest znany jako aplikacja Express. Niektóre aplikacje są bardziej złożone niż inne, prostą aplikacją może być kilka punktów końcowych (identyfikatory URI i adresy URL A.K.A.). Jeśli jest to prosta aplikacja, można zachować interfejs API (Application Program Interface) w głównym pliku znanym jako app.js. w bardziej złożonej aplikacji będziesz wymyślać nazwy plików, dla tego przykładu będę odwoływał się do nazw plików oAuth.js, aby reprezentować reprezentowaną przez nie metodę uwierzytelniania paszportu roszczeń.

Z mojego doświadczenia z aplikacją internetową byś stronę docelową, albo stronie głównej login lub jakieś wiadomości (zwykle określony w statycznej folderze co index.html) W twoim przypadku, gdy definiowanie folderu statycznego jako '../client/' i przekazywanie obiektu index.html.

W najnowszej wersji Ekspresowej 4.X Udostępnianie plików statycznych odbywa się w następujący określony sposób.

serwowania plików, takich jak obrazy, CSS, JavaScript i innych plików statycznych odbywa się za pomocą wbudowanego oprogramowania pośredniczącego w Express - express.static.

Przekaż nazwę katalogu, który ma być oznaczony jako lokalizacja zasobów statycznych, do pliku pośredniego express.static, aby bezpośrednio wyświetlać pliki . Na przykład, jeśli zachować swoje obrazy, CSS i JavaScript w pliki katalogu o nazwie społeczeństwa, można to zrobić:

ekspresowe generator tworzy następujące app.js plik, który jest skonfigurowany to bardzo ważna droga.Ta pierwsza część ma kilka bardzo przydatnych modułów węzła, który jest uparty jak un-Express, a ostatecznie, gdzie można importować kilka własnych API węzłów

var express = require('express'), 
path = require('path'), //core node module 
logger = require('morgan'), //allows you to see the console.logs during development and see incoming and outgoing messages to the server. It also displays `console.log()` defined in any node_module, express route, and express app file. 
cookieParser = require('cookie-parser'), //helps when trying to handle cookies 
bodyParser = require('body-parser'); //helps when parsing certain types of data 

trasy są jak mini ekspresowych aplikacji, należy pamiętać, kiedy po raz pierwszy zastanawiali się, jak niektóre aplikacje mogą stać się bardziej złożone niż inne? W ten sposób zarządzasz złożonością, dzięki czemu aplikacja może się rozwijać i rozwijać. Zakładając, że chcesz dodać nowe funkcje dla kochających i wspaniałych użytkowników.

var route = require('.routes/index',// this is importing the the logic of the URI and URL enpoint to this file. It will be referenced as the second argument in the route and configuration references below. 
    oAuth = require('.routes/oauth') // this is the file where you'll place all of the passport logic you have previously wrote. Any other authenticated routes need to be defined in this file. 

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'jade'); //alot of people are also using EJS equally if not more 

Teraz konfiguracja podstawowych middleware świadczonych przez wyraźnej generatora

app.use(logger('dev')); 
app.use(bodyParser.urlencoded({ extended: true })); 
app.use(bodyParser.json()); 
app.use(bodyParser.json({ type: 'application/vnd.api+json' })); 
app.use(cookieParser()); 
app.use(express.static(path.join(__dirname, 'public'))); //this style declaration ensures you hit what ever directory you want to by changing public as long as that directory exists. 

trasa URI i końcowych URL jest określony przez ciebie -> ekspresowej. Zajmuje postaci łańcuchów i odniesienie do jego trasy na górze tego pliku

app.use('/', routes); //unsecured landing page 

to express użytkowanie obiektu pozwoli na zdefiniowanie interfejsów API, autoryzowane i nieautoryzowane tras. Tutaj zadeklarujesz swoje odniesienie do uwierzytelnionej części aplikacji ekspresowej. Dowolna część zgłoszenia zadeklarowana powyżej app.use('/auth/',oAuth) NIE zostanie uwierzytelniona. Dowolna część zadeklarowana poniżej części adresów URI i adresów URL pod numerem /auth/. zostanie uwierzytelniony.

app.use('/auth/', oAuth); 

Niektóre dodatki, które ekspres ekspresowy umieści w pliku aplikacji, które są niezwykle przydatne.

// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// development error handler 
// will print stacktrace 
if (app.get('env') === 'development') { 
    app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
     message: err.message, 
     error: err 
    }); 
    }); 
} 

// production error handler 
// no stacktraces leaked to user 
app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
    message: err.message, 
    error: {} 
    }); 
}); 

Ponieważ są zanieczyszczenia aplikacjach nazw z un potrzebne złożoności jest nieumyślnie powodując niepożądany wpływ uwierzytelniania. To idzie głębiej, ponieważ zależy od formatowania i konfigurowania interfejsu aplikacji oraz od tego, w jaki sposób są wykonywane pliki javascript w środowisku wykonawczym Węzła, a także od tego, w jaki sposób ramka aplikacji ekspresowej ma być używana i konfigurowana podczas budowania złożonych aplikacji wymagających uwierzytelniania. mieć dostęp.

Teraz wracamy do pytania, dlaczego wciąż otrzymujesz uwierzytelnionego użytkownika, mimo że nikt nie jest zalogowany? To dlatego, że używasz app.use('some string or some middleware'). Aby rozwiązać problem, usuń całe przetwarzanie uwierzytelnienia i przenieś je na trasę. W powyższym przykładzie jest on oznaczony jako oAuth.js. Zdefiniuj wszystkie trasy wymagające uwierzytelnienia za oprogramowaniem pośredniczącym do paszportów.

Teraz, ponieważ twoje pytanie dotyczy również węzła i wspomniałeś w komentarzach, że jesteś częścią scrum, ważne jest, aby stwierdzić, że wszystkie te informacje są zawarte na express website, gdzie tam początkowo połączono moją odpowiedź. Pomimo tego, że mówiłem, że potrzebujesz trasy, a paszport został skonfigurowany nieprawidłowo. Tak więc wszelkie podżegające komentarze "czytają instrukcję" są tworzone, ponieważ uważam, że nie zbadałeś nawet linku, który wysłałem w mojej początkowej odpowiedzi, ani nie przeczytałeś żadnej innej części pracy ekspresowej ramki i ich strony internetowej. Jeśli planujesz zrozumieć, że jakiekolwiek node_modules i złożona ramka działa równie ważne, aby czytać o nich i wykonywać ich tutoriale, faktycznie przechodzą przez node_modules, gdy jest rozpoczęcie i/lub mają odwołania do API. Rozpoczynając prace nad aplikacjami bez próbowania jakiejkolwiek części podstawy systemu, wystarczy, że poświęcisz więcej czasu na kodowanie złego, łamliwego kodu. Znacznie spowolni to twój rozwój, jeśli nie będziesz rozumiał, jak działa moduł node_modules. Najlepszym sposobem na zrozumienie ich funkcjonalności jest czytanie ich. To wszystko dla mojej rant/porady, jak nauczyć się tworzyć aplikację internetową. Ostatecznie będziesz w stanie ponownie wykorzystać wiele kodu samouczka w aplikacji.

+0

Bardzo dziękuję za odpowiedź, zostałem wprowadzony do tego projektu w pośpiechu, nie ma czasu na naukę, zasadniczo pisanie Kod w locie, aby napięty harmonogram, nazywają to scrum? Czy to możliwe, możesz mi powiedzieć rozwiązanie bezpośrednio? Mam tylko 1 użytkownika dla tej strony. Tak czy inaczej, dzięki! – user3552178

+0

@ user3552178 Powiedziałem ci rozwiązanie, jesteś inicjowanie pustego użytkownika w głównej aplikacji. Sprawdź, jaka jest trasa i jak włączyć ją do ekspresu http://expressjs.com/guide/routing.html – Ravenous

+0

westchnę, jeśli potrafię zrozumieć twoje rozwiązanie, nie zrobiłbym tego. t pytali, dziękuję! – user3552178