2013-07-17 98 views
1

我有一個簡單的忘記密碼的功能,當用戶請求更改密碼時,他會收到帶有令牌的電子郵件並點擊它的電子郵件,他將被重定向到一個將採用新密碼的頁面。res.redirect在頁面呈現數據後不起作用

我所做的是當我點擊電子郵件中的一個鏈接時,服務器獲取請求並且一個函數將數據從鏈接中提取出來,並用數據渲染頁面(使用res.render),然後它應該重定向到渲染頁。

我面臨的問題是當我點擊鏈接時,我正在獲取數據和頁面呈現,但我不能讓res.redirect()工作。

我的鏈接看起來像這樣

http://localhost:3000/api/resetpassword?_csrf=ab8aa6a41567f817330e3e0a214725f8b2f88b487d5bef16f162e033c6a63dc41933511ddb79cb44ca049f472b3e0c593dbbaf&email=dummyEmail%2540dumyurl.ca 

然後我用app.get得到服務器的請求()。

app.get('/api/resetpassword', Admin.resetPasswordPage); 

我的渲​​染和重定向功能看起來像這樣;

resetPasswordPage: function (req, res, next) { 
    req.query.email = decodeURIComponent(req.query.email) ; 
    res.render('resetPassword', { 
     Email: req.query.email, 
     Csrf : req.query._csrf, 

    }, function (err, html) { 
     console.log("TESTING HTML ", html); 
     if (!err) 
     res.redirect("/resetPassword"); 
    }); 
} 

渲染是成功的,因爲我得到的HTML參數頁面的完整的HTML,但問題是如何重定向到該頁面。該頁面在EJS及其視圖文件夾中創建。

+0

所以當我從URL中刪除/ api時,它將我正確地重定向到頁面,但網頁不是加載器在瀏覽器中出現錯誤 '此網頁有重定向循環' –

+0

嗨蘇爾曼,我還在一個像你的忘記密碼功能。你有我可以參考的git嗎? – LaneLane

回答

2

這聽起來像你想這個流程:

  1. 用戶點擊鏈接到/api/resetpassword...
  2. 快車運行resetPasswordPage功能
  3. resetPasswordPage與重置密碼錶單HTML頁面進行響應,預裝了基於查詢參數
  4. 我認爲在這一點上你不喜歡瀏覽器地址欄中的URL,這就是爲什麼你認爲你需要重定向。但是你需要這些查詢字符串參數,如果你重定向到/resetPassword,你會失去它們。所以你要麼必須使用URL(我會推薦它是最簡單的),要麼依賴於會話狀態和會話cookie。但是,使用類似passwordResetOK=true之類的標記會話可能會讓您遇到一大堆CSRF攻擊,即_csrf查詢字符串參數可能會阻止。
  5. 這裏你不需要任何重定向,瀏覽器就是這樣。下一步是爲用戶填寫表格,並提交<form method="post" action="/resetPassword">
  6. 瀏覽器POST /resetPassword
  7. 表達路線,要改變密碼,然後或者發送回一個成功頁面或重定向到主頁或其他功能無論如何

這麼長的故事總之,我認爲你只需要接受它是什麼網址,你不需要在這裏重定向,直到密碼重置操作完成後。

+0

Peter感謝您的回覆,是的,這是我所遵循的場景,當我從URL中刪除/ api時,我被重定向到頁面,但瀏覽器發出錯誤「此網頁有重定向循環」 –

+0

寫下您希望查看的序列,包括應用程序應該接收的每個HTTP請求以及您打算髮送的每個相應的HTTP響應,以及瀏覽器對每個響應所做的操作。重定向循環在你的編程序列中是一個非常簡單的錯誤,你應該能夠自己思考拋出和修復。慢點,記筆記,仔細想想,你可以修復循環讓事情發揮作用。 –

+1

是的25分鐘激烈的思想處理解決了這個問題,謝謝。 –