2017-02-14 11 views
0

'testpage'ルートにアクセスしようとしています。しかし、req.isAuthenticated()はこのルートに対してのみfalseを返します。 (このルートは、認証を追加する前にありました)。 ログインページにアクセスし、Googleで認証できます。それで、私は問題なしで 'サインアップ'または 'user_profile'ルートにアクセスできます。エクスプレスルータで特定のルートでパスポート認証が機能しない

はログイン後私がしようとした場合:

はlocalhost:8080/testpage

サーバーが "/" 私を送信します。私がしようとした場合でも:

をローカルホスト:8080/testpage#

エンドでハッシュ記号と、ページがレンダリングされます。

// routes/users.js 

var express = require('express'); 
var router = express.Router(); 

module.exports = function (passport) { 
    router.get('/login', function (req, res) { 
    res.render('login', { message: req.flash('loginMessage') }); 
    }); 

    router.get('/auth/google', passport.authenticate('google', { scope: ['profile', 'email'] })); 

    router.get('/auth/google/callback', 
    passport.authenticate('google', { 
     successRedirect: '/', 
     failureRedirect: '/' 
    })); 

    router.get('/user_profile', isLoggedIn, function (req, res) { 
    res.render('user_profile'); 
    }); 

    router.get('/signup', isLoggedIn, function (req, res) { 
    res.render('signup'); 
    }); 

    router.get('/testpage', isLoggedIn, function (req, res) { 
    res.render('testpage'); 
    }); 

    return router; 

}; 

function isLoggedIn(req, res, next) { 
    if (req.isAuthenticated()) 
    return next(); 

    res.redirect('/'); 
} 

これは何が起こっているのですか?


*更新*

ここに私のapp.js

var express  = require('express'); 
var path   = require('path'); 
var favicon  = require('serve-favicon'); 
var logger  = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var passport  = require('passport'); 
var flash   = require('connect-flash'); 
var session  = require('express-session'); 
var db   = require('./mongoose'); 

var app = express(); 

require('./config/passport')(passport); 

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'hbs'); 

// uncomment after placing your favicon in /public 
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); 
app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: true })); 
app.use(cookieParser()); 
app.use(express.static(path.join(__dirname, 'public'))); 

app.use(session({ 
    secret: 'secret123', 
    resave: true, 
    saveUninitialized: true 
})); 
app.use(passport.initialize()); 
app.use(passport.session()); 
app.use(flash()); 


var users = require('./routes/users')(passport); 

app.use('/', users); 

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

// error handler 
app.use(function(err, req, res, next) { 
    // set locals, only providing error in development 
    res.locals.message = err.message; 
    res.locals.error = req.app.get('env') === 'development' ? err : {}; 

    // render the error page 
    res.status(err.status || 500); 
    res.render('error'); 
}); 


module.exports = app; 

答えて

1

それはパスポートのために必要とされる急行セッションミドルウェアが原因である可能性があります。ミドルウェアを次の順序で使用して修正できます。

var session = require('express-session') 
var app = express() 
app.set('trust proxy', 1) // trust first proxy 
app.use(session({ 
    secret: 'yoursecret', 
    resave: true, 
    saveUninitialized: true, 
    cookie: { secure: true }, 
    // you can store your sessions in mongo or in mysql or redis where ever  you want. 
    store: new MongoStore({ 
     url: "mongourl, 
     collection: 'sessions' // collection in mongo where sessions are to be saved 
    }) 
})) 
// Init passport 
app.use(passport.initialize()); 
// persistent login sessions 
app.use(passport.session()); 

詳細については、https://github.com/expressjs/sessionを参照してください。

また、あなたはGoogleの戦略を設定していないと思います。 次のようないくつかのことを試してみてください

var GoogleStrategy = require('passport-google-oauth').OAuthStrategy; 

// Use the GoogleStrategy within Passport. 
// Strategies in passport require a `verify` function, which accept 
// credentials (in this case, a token, tokenSecret, and Google profile), and 
// invoke a callback with a user object. 

passport.use(new GoogleStrategy({ 
    consumerKey: GOOGLE_CONSUMER_KEY, 
    consumerSecret: GOOGLE_CONSUMER_SECRET, 
    callbackURL: "http://www.example.com/auth/google/callback" 
    }, 
    function(token, tokenSecret, profile, done) { 
     User.findOrCreate({ googleId: profile.id }, function (err, user) { 
     return done(err, user); 
    }); 
} 

));

+0

私は私の質問を更新し、app.jsは、あなたの答えとほぼ同じです。 – Aleph

+0

私の答えが更新されました。そうでなければ、passport.serializeとpassport.deserialize関数をチェックします。 –

0

最後に1日後、URLバーにlocalhost:8000/testpageと入力すると、www.localhost:8000/testpageに変更されたことに気付きました。そして、auth dosはwww *で動作しません。もう1つのことは、Google Chromeはあなたが入力するURLを予測しようとしており、このタイプのエラーが発生する可能性があり、デバッグ時には迷惑になります。だから私はクロムの設定でこのオプションのチェックを外し、予測を防いだ。

unchecked google chrome's settings

関連する問題