2015-11-29 23 views
5

パスポートローカル認証を使用して、ログインが動作したら、getStatusボタンをクリックして動作し、ログアウトします。しかし、ログアウト後、私はブラウザでBACKをクリックしても、それでもgetStatusの完全な内容を表示することができます。 isAuthenticated()のコンソールログには、「あなたはログインしています」と表示されます。これは簡略化されたコードです:Passport 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

これはRavenousの質問に関するapp.get( '/ systemStatus'、isAuthenticated、function(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主催者は、Express Applicationとして知られていますか?いくつかのアプリケーションは他のアプリケーションよりも複雑ですが、単純なアプリケーションはいくつかのエンドポイント(A.K.A.URLとURL)になります。単純なアプリケーションの場合は、メインファイルのAPI(Application Program Interface)をapp.jsのままにしておきます。より複雑なアプリケーションでは、ファイル名を作成します。この例では、パスポート認証方式が表すクレームを表すファイル名はoAuth.jsです。あなたは、メインページ、ログイン、またはあなたのケースでは (通常index.htmlをなどの静的フォルダに定義された)ニュースのいくつかの種類のいずれかをランディングページを持つことになり、Webアプリケーションとの私の経験では

あなた静的フォルダを'../client/'と定義し、オブジェクトindex.htmlを渡します。

Express 4.Xの最新バージョンでは、静的ファイルの提供は次の規定の方法で行われます。画像などのファイルを、サービング

、CSS、JavaScriptやその他の静的ファイル は、内蔵のミドルウェアExpressでの助けを借りて達成される - express.static。

静的資産の位置 としてマークされるディレクトリの名前をexpress.staticミドルウェアに渡して、ファイルを直接 のサービスを開始します。たとえば、あなたが、CSSをあなたのイメージを維持し、公共の名前のディレクトリに JavaScriptファイルならば、あなたはこれを行うことができます:

エクスプレス・ジェネレータは非常に重要に構成され、次のapp.jsファイルを作成します。方法。この最初の部分は急行として非独断あるいくつかの非常に便利なノードモジュールを持っており、インポートよどこ最終的には自分自身のノードのAPIの一部

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 

ルートはミニ急行のアプリケーションのようなもので、私たちが最初にどのように議論したときに覚えています一部のアプリケーションは他のアプリケーションより複雑になることがありますか?これは複雑さを管理して、アプリケーションが成長し、盛んになるようにします。あなたの愛情のある素晴らしいユーザーのために新しい機能を追加したいと仮定します。 >エクスプレス - 今すぐセットアップ急行発電

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エンドポイントによって提供される基本的なミドルウェア

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 

はあなたにによって定義されています。それは、この急行オブジェクトの使用量は、あなたが認可API、および不正なルートを定義することができます

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

このファイルの先頭に文字列の形とそれのルートへの参照を取ります。ここで、Expressアプリケーションの認証された部分への参照を宣言します。 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ファイルの実行方法と、認証を必要とする複雑なアプリケーションを構築する際のExpressアプリケーションフレームワークの使用方法と設定方法アクセスするために。

誰もログインしていないのに認証されたユーザーが引き続きいる理由についての質問に戻ってください。あなたがapp.use('some string or some middleware')を使用しているからです。問題を解決するには、すべての認証処理を削除し、ルートに移動します。上の例では、oAuth.jsと参照されています。パスポートミドルウェアの背後にある認証を必要とするルートを定義します。

あなたの質問はノードに関するものであり、あなたがscrumの一部であるというコメントに言及しているので、この情報はすべて最初に回答をリンクしたexpress websiteに記載することが重要です。私にはあなたにルートが必要であり、そのパスポートが正しく設定されていないと言っていましたが。だから私が最初の答えで送ったリンクを調査していないと感じたり、あなたが急行フレーム作業の他の部分と彼らのウェブサイトを読んだことがないので、炎症のコメントは "マニュアルを読む" node_moduleや複雑なフレームの動作を理解することを計画している場合は、それらについて読んでチュートリアルを行うことも同様に重要ですが、実際にはnode_modulesを参照したり、APIリファレンスを参照したりしてください。フレームワークの基本的な部分を試すことなくアプリケーション開発に爆破することで、悪いコードをコーディングする時間を増やすことができます。 node_modulesの機能を理解していなければ、開発が大幅に遅くなります。機能を理解する最も良い方法は、それらを読むことです。 Webアプリケーションを開発する方法を学ぶための私の誇りとアドバイスのためのものです。最終的には、アプリケーションで多くのチュートリアルコードを再利用することができます。

+0

私はこのプロジェクトに非常に感謝しています。あなたはこのソリューションを直接教えてもらえますか?私はこのウェブページに1人のユーザーしかいません。いずれにしても、ありがとう! – user3552178

+0

@ user3552178メインアプリケーション上で空のユーザを初期化するルートが何であるか、そしてそれらをエクスプレスに組み込む方法を見てください。 – Ravenous

+0

あなたのソリューションを理解できれば、 tは頼んだ、ありがとう! – user3552178

関連する問題