2015-11-29 5 views
5

Использование локальной аутентификации паспорта, вход в систему работает, я нажимаю кнопку getStatus, и она работает, а затем выходит из системы. Но после выхода из системы я нажимаю BACK в браузере, он все равно может отображать полный контент getStatus. В журнале консоли isAuthenticated() по-прежнему говорится, что «вы вошли в систему». Это упрощенный код:Паспорт isAuthenticated() всегда возвращает 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

Какой маршрут получает статус триггера для запроса получения? – Ravenous

+0

Чтобы упростить работу, у меня есть 2 кнопки после входа в систему: получить статус, выйти из системы. – user3552178

+0

, так что это app.get ('/ systemStatus', isAuthenticated, function (req, res), относительно вопроса Ravenous. – user3552178

ответ

3

При взгляде на индекс паспорта. Использование app.use(passport.initialize()) инициализирует пустого пользователя на каждом маршруте. Поскольку вышеупомянутое используется в основном файле app.js, а не в определенном маршруте, оно выполняется каждый раз, когда запрос делается на ваш сервер, по существу создавая пустого пользователя, даже если кто-то не вошел в систему. это код паспорта.

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

Для этой дискуссии о том, почему паспорте настроен неправильно для желаемого влияет и обосновать, почему я заслуживаю тебя воображаемые точек Интернета. Я должен буду убедиться, что мы находимся на одной странице, когда говорим о приложении.

Для обсуждения я буду ссылаюсь на приложение, используя следующую структуру файла, порожденную: (. Есть на самом деле больше файлов, но вы можете посмотреть, что на экспресс-сайте) $ 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 Был ли ваш APP председателем, он известен как экспресс-приложение. Некоторые приложения более сложны, чем другие, простым приложением может быть несколько конечных точек (URI и URL-адреса A.K.A.). Если это простое приложение, хорошо поддерживать API (Application Program Interface) в основном файле, известном как app.js. в более сложном приложении вы создадите имена для своих файлов, для этого примера я буду ссылаться на имена файлов oAuth.js, чтобы представить метод аутентификации паспорта претензий.

В моем опыте с вебом-приложением будет иметь целевую страницу, либо главную страницу, логин, или какое-то новости (как правило, определенное в статической папке, index.html) В вашем случае ваши определяя статическую папку как '../client/' и передавая объект index.html.

В последней версии Express 4.X Обслуживание статических файлов выполняется следующим образом.

Порции файлы, такие как изображения, CSS, JavaScript и других статических файлов осуществляется с помощью встроенного ПО промежуточного слоя в Express - express.static.

Передайте имя каталога, которое должно быть помечено как статическое имущество , в промежуточное ПО express.static, чтобы начать подавать файлы напрямую. Например, если вы храните свои изображения, CSS и JavaScript файлы в каталоге с именем общественности, вы можете сделать это:

Экспресс генератор создаст следующие app.js файл, который настроен очень важный путь.Это первая часть имеет некоторые очень полезные узловые модули, которые не-упрямые, как экспресс, и в конце концов, где вы будете импортировать некоторые из ваших собственных интерфейсов узла

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 

маршруты как мини-экспресс приложения, помните, когда мы впервые обсуждали, как некоторые приложения могут стать более сложными, чем другие? Это то, как вы управляете сложностью, чтобы ваше приложение могло расти и процветать. Предполагая, что вы хотите добавить новые функции для своих любящих и замечательных пользователей.

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 

Теперь настройка основных промежуточное программное предоставляемые экспресс-генератор

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. 

маршрут URI и URL конечных точек определяется Вами -> экспресс. Он принимает форму строки и ссылку на это маршрут в верхней части этого файла

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

это экспресс использование объекта позволит определить API, разрешенные и неразрешенные маршруты. Здесь вы укажете свою ссылку на аутентифицированную часть Экспресс-приложения. Любая часть заявленной заявки app.use('/auth/',oAuth) НЕ будет аутентифицирована. Любая часть, объявленная ниже частью ваших URI и URL-адресов, /auth/. будут аутентифицированы.

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

некоторые дополнительные функции, которые экспресс-генератор будет размещать в файле приложения, которые чрезвычайно полезны.

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

Поскольку вы загрязняют ваши приложения имен с ООН необходимой сложности он неосторожно вызывает у вас нежелательны аутентификации влияет. Это происходит глубже, поскольку это связано с форматированием и настройкой интерфейса вашей прикладной программы и тем, как файлы javascript выполняются в среде выполнения Node, а также о том, как должна использоваться и настраиваться среда экспресс-приложений при создании сложных приложений, требующих аутентификации для доступа.

Теперь вернемся к вашему вопросу, почему вы продолжаете получать аутентифицированного пользователя, хотя никто не вошел в систему? Это потому, что вы используете app.use('some string or some middleware'). Чтобы устранить проблему, удалите всю вашу проверку подлинности и переместите ее на маршрут. В приведенном выше примере он упоминается как oAuth.js. Определите любые маршруты, требующие аутентификации за промежуточным программным обеспечением паспорта.

Теперь, поскольку ваш вопрос касается узла, и вы упомянули в комментариях, что вы являетесь частью scrum, важно указать, что вся эта информация содержится в файле express website, в котором я первоначально связал свой ответ. Несмотря на то, что я говорю вам, что вам нужен маршрут, и этот паспорт был настроен неправильно. Таким образом, любые воспалительные комментарии «прочитайте руководство» сделаны, потому что я чувствую, что вы даже не исследовали ссылку, которую я отправил в своем первоначальном ответе, и вы не читали какую-либо другую часть экспресс-кадра и их веб-сайт. Если вы планируете понимать, что какие-либо узловые_модули и сложные фреймы работают, то не менее важно прочитать о них и выполнять их учебники, на самом деле пройти через node_modules, когда есть начало работы и/или у них есть ссылки на API. Взрывая в разработку приложений, не пытаясь использовать какую-либо часть базовых основ, вы просто потратите больше времени на кодирование плохого разрываемого кода. Это значительно замедлит ваше развитие, если вы не понимаете, как работает функция node_modules. Их лучший способ понять их функциональность - прочитать их. Это все для моего разговора/совета для изучения того, как разработать веб-приложение. В конечном итоге вы сможете повторно использовать много кода учебника в приложении.

+0

Большое спасибо за ответ, я был поставлен в этот проект в спешке, не успел учиться, в основном писать код на лету, чтобы сделать жесткий график, они называют это scrum? Возможно ли, что вы скажете мне решение напрямую? У меня только 1 пользователь для этой веб-страницы. В любом случае, спасибо! – user3552178

+0

@ user3552178 Я сказал вам решение, вы инициализируя пустого пользователя в главном приложении.Посмотрите, какой маршрут и как включить их в экспресс. http://expressjs.com/guide/routing.html – Ravenous

+0

вздох, если я смогу понять ваше решение, t спросил, спасибо! – user3552178

Смежные вопросы