2017-08-17 78 views
0

所以我最終試圖在節點中創建一個登錄頁面。如果一個人試圖去一個不同的位置開始,他們應該被路由到登錄頁面。如何通過Node.JS創建經過身份驗證的登錄?

我使用「/」作爲重定向到「/ login /」。 「/ login /」包含輸入用戶名/密碼的表單。一旦他們輸入信息,然後路由回「/」。

遇到一些問題。如果我排除了原始URL爲「/」並且某人轉到「/ login /」時重定向的代碼,那麼他們可以填寫表單並重定向。

如果我保留重定向的代碼,它會自動重定向到登錄頁面,然後由於重定向而重新加載到登錄頁面。這是一個奇怪的循環,我無法擺脫。我知道我可以把「/ login /」放在另一端,但我想保留它「/」。

關於修復重定向循環的任何想法?編輯:所以我知道問題是什麼。我不存儲比較(不使用會話)。任何有關用於檢查會話的最佳中間件的線索?

如何添加身份驗證甚至添加用戶名/密碼到數據結構?

下面是代碼,我想出了:

const express = require("express"); //Express 
const path = require ("path"); 
const session = require("express-session"); //Express Session 
const app = express(); 
const mustache = require ("mustache"); 
const mustacheExpress = require('mustache-express'); 
const bodyParser = require ("body-parser"); 

app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({extended:true})); 

app.engine('mustache', mustacheExpress()); 
app.set('views', './views') 
app.set('view engine', 'mustache') 

app.use(session({ 
    secret: 'keyboard cat', 
    resave: false, 
    saveUninitialized: false, 
    cookie:{} 
})); 

app.use((req, res, next) => { 
    if (req.originalUrl === '/') { 
    res.redirect("/login/"); 
    } 
    next(); 
}); 


const list = [ 
    { 
    username: "", 
    password: "", 
    } 
]; 

const data = { 
    users:list 
}; 

app.get('/login/', function (req, res) { 
    res.render("users", data); 
}); 


app.post("/", function(req, res){ 
    console.log(req.body); 
    let username = req.body.username; 
    let password = req.body.password; 
    let response = `Here are your credentials for the site: <br/> 
    This is your username: ${username} <br/> 
    This is your password: ${password} <br/> 
    <img src="http://media1.giphy.com/media/c54YHGDH63jJC/giphy.gif"/>` 
    res.send(response); 
}); 

app.post("/", function (req, res) { 
    console.log(list); 
    list.push({username:req.body.username}); 
    list.push({username:req.body.password}); 
    res.redirect('/'); 
}) 

app.listen(3000, function() { 
    console.log('Creating login page'); 
}) 

回答

0

如果每個用戶點擊根(/),他們將被重定向到/登錄時間,然後登錄成功重定向他們回到根,你顯然有一個我認爲你知道的路由循環。

最簡單的解決方案是建立一條新路線來指導用戶成功登錄,例如/ home。我看到你正在發回應答,所以我會提供2種可能性。另外,對於相同的POST路由,您有2個不同的處理程序,這是不必要的。這是我會建議的:

app.post("/login", function(req, res){ 
    console.log(req.body); 

    let username = req.body.username; 
    let password = req.body.password; 

    let response = `Here are your credentials for the site: <br/> 
     This is your username: ${username} <br/> 
     This is your password: ${password} <br/> 
     <img src="http://media1.giphy.com/media/c54YHGDH63jJC/giphy.gif"/>`; 

    // actions from duplicate route handler 
    console.log(list); 

    list.push({username:req.body.username}); 
    list.push({username:req.body.password}); 

    // this is assuming you are handling errors on the front end 
    res.status(201).send(response); 

}); 

然後,我會採取行動,從您的api成功響應,然後在前端更改使用JavaScript的路線。

window.location.assign(urlToNewRoute); 

或者,也可以與該響應作爲查詢字符串發送重定向,然後解析該在前端而不是發送res.status(201)。發送(響應)。

res.redirect(`/home?message=${response}`); 

這真的取決於你如何設計你的API和前端網站。這些只是幾個選項。實際上,您應該在POST路徑中進行錯誤處理,以檢查用戶是否存在,是否輸入了正確的密碼等,然後發回201,400,404或其他一些簡潔的狀態,然後可以在前面處理結束。

希望這會有所幫助。

0

你說得對。您需要將一些會話信息從/login/重定向回/。最簡單的方法是返回控制器可以驗證的令牌,如果它無效,可以重定向回/login/。您可以將JWT用於令牌。

相關問題