2015-11-29 15 views
5

Sử dụng xác thực địa phương hộ chiếu, công việc đăng nhập, tôi nhấp vào nút getStatus và hoạt động, sau đó đăng xuất hoạt động. Nhưng sau khi đăng xuất, tôi bấm BACK trong trình duyệt, nó vẫn có thể hiển thị toàn bộ nội dung của getStatus. Nhật ký giao diện điều khiển trong số isAuthenticated() vẫn cho biết "bạn đã đăng nhập". Đây là mã được đơn giản hóa:Hộ chiếu được chứng thực() luôn trả về TRUE

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

Tuyến đường nào nhận được kích hoạt trạng thái cho yêu cầu nhận? – Ravenous

+0

Để đơn giản hóa mọi thứ, tôi có 2 nút ngay bây giờ sau khi đăng nhập: nhận trạng thái, đăng xuất. – user3552178

+0

vì vậy nó app.get ('/ systemStatus', isAuthenticated, chức năng (req, res), liên quan đến câu hỏi của Ravenous – user3552178

Trả lời

3

Khi xem chỉ mục hộ chiếu. Việc sử dụng app.use(passport.initialize()) đang khởi tạo một người dùng trống trên mọi tuyến đường. Vì ở trên đang được sử dụng trên tệp app.js chính và không nằm trong một tuyến đường cụ thể, nó được thực thi mỗi lần yêu cầu được thực hiện cho máy chủ của bạn, về cơ bản tạo người dùng trống ngay cả khi ai đó không đăng nhập. là mã hộ chiếu.

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

Đối với cuộc thảo luận này về việc tại sao hộ chiếu bị cấu hình sai cho mong muốn ảnh hưởng và để biện minh cho lý do tại sao tôi xứng đáng bạn điểm internet tưởng tượng. Tôi sẽ phải chắc chắn rằng chúng tôi đang ở trên cùng một trang khi nói về ứng dụng.

Đối với các cuộc thảo luận tôi sẽ đề cập đến các ứng dụng bằng cách sử dụng cấu trúc tập tin dưới đây được tạo ra bằng cách: (. Có thực sự nhiều file nhưng bạn có thể xem rằng trên trang web nhanh) $ 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 Được APP của bạn chủ trì, nó được gọi là một ứng dụng Express. Một số ứng dụng phức tạp hơn các ứng dụng khác, một ứng dụng đơn giản có thể là một vài điểm cuối (các URL và URL A.K.A.). Nếu đó là một ứng dụng đơn giản, bạn có thể giữ API (Giao diện chương trình ứng dụng) trong tệp chính được gọi là app.js. trong một ứng dụng phức tạp hơn, bạn sẽ tạo tên cho các tệp của mình, ví dụ này tôi sẽ tham chiếu đến tên tệp oAuth.js để thể hiện phương thức xác thực hộ chiếu yêu cầu.

Theo kinh nghiệm của tôi với một ứng dụng web mà bạn sẽ có một trang đích, hoặc là một trang chính, đăng nhập, hoặc một số loại tin tức (thường được định nghĩa trong thư mục tĩnh như index.html) Trong trường hợp của bạn của bạn xác định thư mục tĩnh là '../client/' và chuyển đối tượng index.html.

Trong phiên bản gần đây nhất của Express 4.X Cung cấp tệp tĩnh được thực hiện theo cách được quy định sau đây.

Phục vụ các file, chẳng hạn như hình ảnh, CSS, JavaScript và các tập tin tĩnh khác được thực hiện với sự giúp đỡ của một middleware tích hợp sẵn trong Express - express.static.

Chuyển tên thư mục, được đánh dấu là vị trí nội dung tĩnh, cho phần mềm trung gian express.static để bắt đầu phân phát trực tiếp các tệp. Ví dụ, nếu bạn giữ hình ảnh của bạn, CSS, và file JavaScript trong một thư mục có tên nào, bạn có thể làm điều này:

tốc máy phát điện sẽ tạo ra những điều sau app.js tập tin mà được cấu hình rất quan trọng đường.Phần đầu tiên này có một số module nút rất hữu ích được un-khăng khăng như nhanh, và cuối cùng là nơi bạn sẽ nhập một số API nút riêng bạn

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 

đường bay như nhỏ các ứng dụng nhanh, nhớ khi chúng ta đầu tiên thảo luận như thế nào một số ứng dụng có thể trở nên phức tạp hơn những ứng dụng khác? Đây là cách bạn quản lý sự phức tạp để ứng dụng của bạn có thể phát triển và phát triển. Giả sử bạn muốn thêm các tính năng mới cho người dùng yêu thương và tuyệt vời của bạn.

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 

Bây giờ thiết lập middlewares cơ bản được cung cấp bởi tốc-máy phát điện

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. 

đường URI và điểm cuối URL được định nghĩa bởi bạn -> nhanh. Nó có dạng chuỗi và tham chiếu đến tuyến đường ở đầu tệp này

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

cách sử dụng đối tượng thể hiện này sẽ cho phép bạn xác định API, đường được ủy quyền và không được phép. Đây là nơi bạn sẽ khai báo tham chiếu đến phần được xác thực của ứng dụng Express. Bất kỳ phần nào của đơn được khai báo ở trên app.use('/auth/',oAuth) sẽ KHÔNG được xác thực. Bất kỳ phần nào được khai báo bên dưới phần /auth/ của URI và URL của bạn. sẽ được xác thực.

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

một số tính năng bổ sung mà trình tạo tốc độ sẽ đặt trong tệp ứng dụng cực kỳ hữu ích.

// 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: {} 
    }); 
}); 

Vì bạn đang làm ô nhiễm không gian tên ứng dụng của bạn với độ phức tạp không cần thiết nên vô tình gây ra các ảnh hưởng xác thực không mong muốn. Điều này đi sâu hơn vì nó liên quan đến định dạng và cấu hình giao diện chương trình ứng dụng của bạn và cách các tệp javascript được thực hiện trong môi trường thời gian chạy Node, cũng như cách khung ứng dụng nhanh được sử dụng và định cấu hình khi xây dựng các ứng dụng phức tạp yêu cầu xác thực truy cập vào.

Bây giờ, hãy quay lại câu hỏi lý do tại sao bạn tiếp tục nhận được người dùng được xác thực mặc dù không có ai đăng nhập? Đó là vì bạn sử dụng app.use('some string or some middleware'). Để khắc phục sự cố, hãy xóa tất cả quá trình xử lý xác thực của bạn và chuyển nó sang tuyến đường. Trong ví dụ trên, nó được tham chiếu là oAuth.js. Xác định bất kỳ tuyến đường nào cần xác thực phía sau phần mềm trung gian hộ chiếu.

Bây giờ vì câu hỏi của bạn cũng liên quan đến nút và bạn đã đề cập trong nhận xét rằng bạn là một phần của scrum, điều quan trọng là phải nêu rõ rằng tất cả thông tin này có trên express website. Mặc dù tôi nói với bạn rằng bạn cần một con đường và hộ chiếu được cấu hình không chính xác. Vì vậy, bất kỳ nhận xét viêm "đọc hướng dẫn" được thực hiện bởi vì tôi cảm thấy rằng bạn thậm chí không điều tra liên kết tôi đã gửi trong câu trả lời ban đầu của tôi, cũng không đọc bất kỳ phần nào khác của công việc khung nhanh và trang web của họ. Nếu bạn định hiểu bất kỳ node_modules và khung phức tạp nào cũng quan trọng không kém để đọc về chúng và thực hiện các hướng dẫn của chúng, thực sự đi qua node_modules khi có một bắt đầu và/hoặc chúng có tham chiếu API. Bằng cách nổ mìn vào phát triển ứng dụng mà không cần thử bất kỳ phần nào của các khái niệm cơ bản về khung công tác sẽ chỉ khiến bạn mất nhiều thời gian hơn để mã hóa mã có thể bị hỏng. Nó sẽ làm chậm sự phát triển của bạn một cách đáng kể nếu bạn không hiểu cách hàm node_modules. Cách tốt nhất để hiểu chức năng của họ là đọc chúng. Đó là tất cả cho rant/lời khuyên của tôi cho việc học cách phát triển một ứng dụng web. Cuối cùng, bạn sẽ có thể sử dụng lại rất nhiều mã hướng dẫn của bạn trong một ứng dụng.

+0

Cảm ơn rất nhiều cho trả lời, tôi đã được đưa vào dự án này trong một vội vàng, không có thời gian để tìm hiểu, về cơ bản bằng văn bản mã trên bay để làm cho lịch trình chặt chẽ, họ gọi nó là scrum? Có thể bạn cho tôi biết giải pháp trực tiếp? Tôi chỉ có 1 người dùng cho trang web này. Dù bằng cách nào, cảm ơn! – user3552178

+0

@ user3552178 Tôi đã nói với bạn giải pháp, bạn khởi tạo một người dùng trống trên ứng dụng chính. Hãy tìm hiểu xem tuyến đường là gì và cách kết hợp chúng thành nhanh. http://expressjs.com/guide/routing.html – Ravenous

+0

thở dài, nếu tôi có thể hiểu được giải pháp của bạn, tôi sẽ ' t đã yêu cầu, cảm ơn! – user3552178

Các vấn đề liên quan