2014-02-23 40 views
2

Hy並且在此先感謝,所以我在一個項目中工作,其中的一部分要求是要有一個用戶可以插入的字段是電子郵件,然後在他的電子郵件上收到一個自定義URL帳戶,從那裏他可以訪問該網站。這就像一個「密碼重置」的例子,其中一個自定義url被生成並通過時間戳驗證發送給你。我對nodejs非常新,我的問題在於如果任何人有某種類型的指導開始這樣做。我的想法是生成一個會話ID,然後生成一個自定義URL,發送電子郵件,然後用戶轉到網頁。即時通訊使用快遞,整個網站已經組裝,它只是這個功能,這是殺了我! :(NodeJS Sessions

+1

使用散列函數爲電子郵件生成唯一的散列值,然後將其附加到URL中。您還應該將時間戳添加到散列計算。 –

+0

非常有幫助,謝謝。但我需要更多的東西,比如記錄用戶在網站上的操作,他訪問過哪些頁面,以及他提交了哪些操作,爲此我需要會話,將用戶歷史記錄保存在Cookie中,或者我認爲這一切這裏錯了嗎?感謝您的回答,我真的喜歡它 –

+1

@pakkolol一個簡單的驗證碼和哈希與一些時間限制重置密碼(如上所述),將訣竅實際上知道它的所有者重置密碼,而不是一些其他人,儘管這種方式可能無法正常工作,如果用戶的電子郵件受到威脅。發送包含密碼重置更新的電子郵件,以防萬一。另外請看看雙因素身份驗證,即將PIN發送到電子郵件或在有限時間內有效的手機。 – Gntem

回答

1

我不知道你需要什麼,但這裏是我建議(談到這個Reddit上更早)。

// If you want the user to **have** to be a custom URL 
req.param('userId', function(req, res, next) { 
    db.getUser(userId, function(e, usr) { 
     if (e) throw new Error(e); 

     req.user = usr; 
    }); 
}); 

req.all("*", function(req, res, next) { 
    if (!req.user) return res.redirect('/login'); 
}); 

// Rest of routes 
req.get() 
req.post() 

話雖這麼說,你通常不應該有用戶。如果你做這種方式登錄這種方式通常你會設置用戶在會話和驗證這種方式Here's a good article on setting up sessions in Express.

,你會做這樣的事情:

req.all("*", function(req, res, next) { 
    var userId = req.session('userid'); 
    if (!userId) res.redirect('/login'); 

    db.getUser(userId, function(e, usr) { 
     if (e) throw new Error(e); 
     if (!usr) return res.redirect('/login'); 

     // Now the user is accessbile through its session 
     req.session.user = usr; 
    }); 
}); 

// Rest of routes 
req.get() 
req.post() 

密碼重置需要所謂的隨機數。這將是您的數據庫中有一個創建日期的小對象。您可以通過電子郵件向他們發送使用該隨機數的網站鏈接。

每當使用密碼重置隨機數命中路由時,您會在數據庫中查看它,驗證它是否足夠新(在X小時或數天內),然後讓它們訪問重置其密碼的路由。

您的項目需求非常模糊,所以我不完全確定您需要什麼。

0

至於我的理解你想要如何使用expressjs實現密碼重置功能。

下面是步驟 1. 爲忘記密碼 創建API

app.post('/forgotpassword',function(req,res){ 
    var email = req.body.email; 
     // validation 
     // your custom url creation logic here 
     // someurl/:resetpasswordtoken 
     // store this in user data 
     // for this I'll suggest to use any unique string creation logic* 

    } 
  • 顯示覆位密碼頁

    app.get('/someurl/:resetpasswordtoken, function(req,res) { 
        //check token exist 
        // render the page for reset like current passwor,new password 
    } 
    
  • 動作重置密碼

    app.post('/someurl/:resetpasswordtoken , function(req,res){ 
        var currentPwd = //get current pwd 
        var newPwd = //get new pwd 
        //check token 
        //then reset password for user 
    }