2017-05-07 59 views
0

我正在寫一個本地註冊策略,並注意到它不起作用,所以我退後一步,試圖對我的空集合進行身份驗證。我每次提交表格需要30-40s,直到超時。我確保passport.authenticate()被調用,但它似乎ike它沒有做任何重定向,因此它是超時的,因爲我沒有渲染任何東西。Passport Authenticate不重定向

問題:

  1. 我預計它會做一個重定向到failureUrl(這是「/註冊」),而是什麼也沒有發生。我在這裏做錯了什麼?
  2. 爲什麼沒有單一的日誌消息來自護照?這讓我瘋狂,因爲我完全不知道那裏出了什麼問題。
  3. 我是新來的node.js和據我所知我不需要將配置的護照對象傳遞給路由器,而是我可以做const passport = require('passport')是正確的?

這是我的/註冊路由功能的處理程序:

function processSignup (req, res) { 
    logger.info("POST request received") 
    logger.info(req.body) 
    passport.authenticate('local', { 
     successRedirect : '/profile', // redirect to the secure profile section 
     failureRedirect : '/signup', // redirect back to the signup page if there is an error 
     failureFlash : true // allow flash messages 
    }) 
} 

溫斯頓打印:

7:32:04 PM - info: POST request received 7:32:04 PM - info: [email protected], password=dasdsa, submit=Register

我passport.js文件看起來像這樣:

const LocalStrategy = require('passport-local').Strategy 
const User = require('./user-model') 
const passport = require('passport') 

// expose this function to our app using module.exports 
function config() { 
    passport.serializeUser(function(user, done) { 
     done(null, user.id) 
    }) 

    // used to deserialize the user 
    passport.deserializeUser(function(id, done) { 
     User.findById(id, function(err, user) { 
      done(err, user) 
     }) 
    }) 

    passport.use(new LocalStrategy(
     function(username, password, done) { 
      User.findOne({ username: username }, function(err, user) { 
       if (err) { return done(err); } 
       if (!user) { 
        return done(null, false, { message: 'Incorrect username.' }); 
       } 
       if (!user.validPassword(password)) { 
        return done(null, false, { message: 'Incorrect password.' }); 
       } 
       return done(null, user); 
      }); 
     } 
    )); 
} 

module.exports = { 
    config: config 
} 

我app.js的相關文檔片斷:

// required for passport 
require('./authentication/passport').config(); 
app.use(cookieParser()) 
app.use(bodyParser()) 
app.use(session({ 
    secret: 'secretToBeChanged', 
    saveUninitialized: false, 
    resave: false 
})) 
app.use(passport.initialize()) 
app.use(passport.session()) // persistent login sessions 
app.use(flash()) // use connect-flash for flash messages stored in session 
+0

不熟悉的護照,但我敢肯定,你需要做的'res'對象的東西,否則該請求將永遠不會得到迴應。我的猜測是你以某種方式將對象提供給'passport.authenticate()'函數,以便它可以處理它。 –

回答

2

一個快速瀏覽一下passportjs的文件後,我想你需要做這樣的事情:

function processSignup (req, res, next) { 
    logger.info("POST request received") 
    logger.info(req.body) 
    const handler = passport.authenticate('local', { 
     successRedirect : '/profile', // redirect to the secure profile section 
     failureRedirect : '/signup', // redirect back to the signup page if there is an error 
     failureFlash : true // allow flash messages 
    }); 
    handler(req, res, next); 
} 

passport.authenticate()返回一個用作路由處理函數的函數。
通常情況下,您可以鍵入類似:

app.post('/login', passport.authenticate('local', { 
    successRedirect: '/', 
    failureRedirect: '/login', 
    failureFlash: true 
})); 

但既然你已經用自己的路由處理功能抽象,需要調用從passport.authenticate()的一個返回。

+0

我已經試過這個,但是這個以500error結尾:7:57:42 PM - 警告:httpStatuscode = 500,errorMessage = TypeError:next不是函數 7:57:42 PM - error:TypeError:next is not在Strategy.module.exports.strategy上的函數 。錯誤(c:\ Users \ *** \ Documents \ tms-reworked \ node_modules \ passport \ lib \ middleware \ authenticate.js:343:9) – kentor

+0

啊,你需要通過傳遞給路由處理函數的第三個參數,我已經更新了我的回答 –

+0

據我瞭解,這只是自定義回調,但我的原始代碼應該工作,不是嗎?因爲我現在又面臨與其他護照功能相同的問題。 – kentor

0

最後Mikael Lennholm是對的,他指出我正確的方向。我無法在任何passport.js教程中找到它。然而,passport.js文檔包含此代碼片段表示相同的,但我更喜歡它的代碼風格:

passport.authenticate('local', function(err, user, info) { 
    if (err) { return next(err); } 
    if (!user) { return res.redirect('/login'); } 
    req.logIn(user, function(err) { 
     if (err) { return next(err); } 
     return res.redirect('/users/' + user.username); 
    }); 
    })(req, res, next);