2013-07-30 98 views
12

我試圖在/register表單上提交POST後立即進行認證和登錄用戶。理想情況下,我希望用戶能夠註冊,然後立即重定向到儀表板,而無需再次輸入憑據。新用戶註冊後立即通過護照認證

我的服務器正在使用Passport 0.1.17,本地策略配置爲使用電子郵件地址和密碼進行登錄。當前的代碼是:

app.post('/register', function(req, res) { 

    // attach POST to new User variable 
    var registerUser = new User({ email: req.body.email, password: req.body.password, name: req.body.name }); 

    // save registerUser Mongo 
    registerUser.save(function(err) { 
    if(err) { 
     console.log(err); 
    } else { 
     console.log('registerUser: ' + registerUser.email + " saved."); 
    } 
    }); 

    // here is where I am trying to authenticate and then redirect 
    passport.authenticate('local', { failureRedirect: '/login', failureFlash: true }), 
    res.redirect('/dashboard'); 
    }); 

我該如何重構此代碼以保存新用戶,然後進行身份驗證並最終重定向到儀表板?

在此先感謝!

+2

使用'req.logIn'方法在註冊後直接進行身份驗證。 – moka

+0

感謝您引用'req.logIn',這是我以前不知道的。你能提供更具體的代碼嗎?我在上面的問題的最後一個註釋之後嘗試了以下內容,但它不起作用:'req.login(registerUser,function(err){if(err){return next(err);} return res.redirect '/ dashboard'); });' – surfearth

+0

您需要提供用於反序列化用戶的詳細信息,通常它是存儲在會話中的用戶的ID。 – moka

回答

19

這是我閱讀req.login後想出瞭解決方案:

app.post('/register', function(req, res) { 
    // attach POST to user schema 
    var user = new User({ email: req.body.email, password: req.body.password, name: req.body.name }); 
    // save in Mongo 
    user.save(function(err) { 
    if(err) { 
     console.log(err); 
    } else { 
     console.log('user: ' + user.email + " saved."); 
     req.login(user, function(err) { 
     if (err) { 
      console.log(err); 
     } 
     return res.redirect('/dashboard'); 
     }); 
    } 
    }); 
}); 

我想清理一下,覺得犯錯部分可能會更強勁,但是這是一個有效的解決方案。請注意,其他人實現這一點,他們應該知道,它是適合使用護照本地策略與電子郵件,而不是用戶名。

+1

來自新手的查詢:這是否意味着您將用戶的密碼作爲純文本存儲在數據庫中?所以如果有人得到你的數據庫,他們可以讀取你的用戶密碼? –

+2

@Paul D. White:我知道這是陳舊的,但爲了回答你的問題,爲了未來的讀者的利益,通常在用戶模型類本身內處理加密,對於其他應用程序是透明的(這有利於使其不可避免)。 – Matt

+0

@Matt:不錯,歡呼聲歡呼。 –