2015-11-29 11 views
5

पासपोर्ट स्थानीय प्रमाणीकरण का उपयोग करके, लॉगिन कार्य करता है, मैं getStatus बटन क्लिक करता हूं और यह काम करता है, फिर लॉगआउट काम करता है। लेकिन लॉगआउट के बाद, मैं ब्राउज़र में वापस क्लिक करता हूं, यह अभी भी getStatus की पूरी सामग्री प्रदर्शित कर सकता है। 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

तो यह ऐप.जेट ('/ systemStatus' है, अवांछित, फ़ंक्शन (req, res), रावेनस के प्रश्न के बारे में है। – 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.js के नाम से जाना ठीक है। एक अधिक जटिल अनुप्रयोग में आप अपनी फाइलों के लिए नाम तैयार करेंगे, इस उदाहरण के लिए मैं दावे पासपोर्ट प्रमाणीकरण विधि का प्रतिनिधित्व करने के लिए फ़ाइल नाम oAuth.js का संदर्भ दूंगा।

एक वेब अनुप्रयोग आप एक लैंडिंग पृष्ठ या तो एक मुख्य पृष्ठ, एक लॉगिन, या समाचार के कुछ प्रकार आपके मामले में (आमतौर पर index.html के रूप में स्थिर फ़ोल्डर में परिभाषित) के लिए होता है, के साथ मेरा अनुभव में अपने स्थिर फ़ोल्डर को '../client/' के रूप में परिभाषित करना और ऑब्जेक्ट index.html को पास करना।

एक्सप्रेस 4.X के नवीनतम संस्करण में स्थिर फाइलों को निम्नलिखित निर्धारित तरीके से किया जाता है। express.static - ऐसी छवियों, सीएसएस, जावास्क्रिप्ट और अन्य स्थिर फ़ाइलों रूप

सेवित फ़ाइलें, एक्सप्रेस में एक अंतर्निहित मिडलवेयर की मदद से पूरा किया है।

निर्देशिका का नाम पास करें, जिसे स्थिर संपत्तियों के स्थान के रूप में चिह्नित किया जाना है, एक्सप्रेस.स्टैटिक मिडलवेयर पर सीधे फ़ाइलों की सेवा शुरू करने के लिए। उदाहरण के लिए, यदि आप एक नामी निर्देशिका के सार्वजनिक रूप से आपकी छवियों, सीएसएस, और 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. 

मार्ग यूआरआई और यूआरएल अंतिमबिंदुओं द्वारा प्रदान की बुनियादी middlewares आप के लिए द्वारा परिभाषित किया जा रहा। यह तार के रूप और इस फ़ाइल

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

इस एक्सप्रेस वस्तु उपयोग के शीर्ष पर यह मार्ग के लिए एक संदर्भ लेता है जिसे आप API, अधिकृत और अनाधिकृत मार्गों को परिभाषित करने की अनुमति देगा। यह वह जगह है जहां आप एक्सप्रेस एप्लिकेशन के प्रमाणीकृत हिस्से में अपना संदर्भ घोषित करेंगे। app.use('/auth/',oAuth) से ऊपर घोषित आवेदन के किसी भी हिस्से को प्रमाणित नहीं किया जाएगा। आपके यूआरआई और यूआरएल के /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: {} 
    }); 
}); 

क्योंकि आप संयुक्त राष्ट्र जरूरी जटिलता के साथ अपने अनुप्रयोगों नेमस्पेस को दूषित कर रहे हैं कि कहीं अनजाने में खड़ी कर रहा है आप अवांछित प्रमाणीकरण प्रभावित करता है। यह गहरा हो जाता है क्योंकि यह आपके अनुप्रयोग प्रोग्राम इंटरफ़ेस को स्वरूपित करने और कॉन्फ़िगर करने के संबंध में है और कैसे नोड रन-टाइम वातावरण में जावास्क्रिप्ट फ़ाइलों को निष्पादित किया जाता है, साथ ही साथ कस्टम अनुप्रयोग ढांचे का उपयोग करने के लिए और जटिल कॉन्फ़िगरेशन की आवश्यकता होती है, जिन्हें जटिल अनुप्रयोगों के निर्माण के लिए कॉन्फ़िगर किया जाता है उपयोग करने के लिए।

अब अपने प्रश्न पर वापस जाएं कि आप एक प्रमाणित उपयोगकर्ता क्यों रहते हैं हालांकि कोई भी लॉग इन नहीं है? ऐसा इसलिए है क्योंकि app.use('some string or some middleware') का उपयोग। इस समस्या को ठीक करने के लिए अपनी सभी प्रमाणीकरण प्रक्रिया को हटा दें और इसे रूट पर ले जाएं। उपर्युक्त उदाहरण में इसे oAuth.js के रूप में संदर्भित किया गया है। पासपोर्ट मिडलवेयर के पीछे प्रमाणीकरण की आवश्यकता वाले किसी भी मार्ग को परिभाषित करें।

अब आप अपने सवाल भी नोड के बारे में है और आप उन टिप्पणियों है कि आप एक scrum यह राज्य के लिए है कि इस जानकारी के सभी जो वह जगह है जहाँ मैं शुरू में मेरा उत्तर जुड़ा हुआ express website पर निहित है महत्वपूर्ण है का हिस्सा हैं में उल्लेख किया है। मुझे आपको बताने के बावजूद कि आपको एक मार्ग की आवश्यकता है और वह पासपोर्ट गलत तरीके से कॉन्फ़िगर किया गया था। तो किसी भी ज्वलनशील टिप्पणियां "मैन्युअल पढ़ें" बनाई गई हैं क्योंकि मुझे लगता है कि आपने मेरे प्रारंभिक उत्तर में भेजे गए लिंक की जांच भी नहीं की है, न ही आपने एक्सप्रेस फ्रेम कार्य और उनकी वेबसाइट के किसी भी अन्य भाग को पढ़ा है। यदि आप किसी भी नोड_मोड्यूल और जटिल फ्रेम को समझने की योजना बनाते हैं तो उनके बारे में पढ़ने और उनके ट्यूटोरियल करने के लिए समान रूप से महत्वपूर्ण काम करते हैं, वास्तव में नोड_मोड्यूल के माध्यम से जाते हैं जब प्रारंभ हो रहा है और/या उनके पास एपीआई संदर्भ हैं। फ्रेमवर्क मूलभूत बातें के किसी भी हिस्से की कोशिश किए बिना आवेदन विकास में विस्फोट करके आप खराब ब्रेक करने योग्य कोड कोडिंग करने में अधिक समय व्यतीत करेंगे। यदि आप समझ नहीं रहे हैं कि node_modules कैसे कार्य करता है तो यह आपके विकास को काफी धीमा कर देगा। उनकी कार्यक्षमता को समझने का सबसे अच्छा तरीका उन्हें पढ़ना है। वेब एप्लिकेशन को विकसित करने के तरीके सीखने के लिए यह मेरी रेंट/सलाह के लिए है। आखिरकार आप एप्लिकेशन में अपने बहुत सारे ट्यूटोरियल कोड का पुन: उपयोग कर पाएंगे।

+0

उत्तर के लिए बहुत बहुत धन्यवाद, मुझे इस परियोजना में भागने के लिए, सीखने का कोई समय नहीं, मूल रूप से लिखना तंग अनुसूची बनाने के लिए फ्लाई पर कोड, वे इसे स्क्रम कहते हैं? क्या यह संभव है कि आप मुझे सीधे समाधान बताएं? मेरे पास इस वेबपृष्ठ के लिए केवल 1 उपयोगकर्ता है। किसी भी तरह, धन्यवाद! – user3552178

+0

@ user3552178 मैंने आपको समाधान बताया, आप हैं मुख्य ऐप पर रिक्त उपयोगकर्ता को प्रारंभ करना। देखें कि एक मार्ग क्या है और उन्हें अभिव्यक्ति में कैसे शामिल किया जाए। http://expressjs.com/guide/routing.html – Ravenous

+0

श्वास, अगर मैं आपके समाधान को समझ सकता हूं, तो मैं ' टी ने पूछा है, धन्यवाद! – user3552178

संबंधित मुद्दे