2017-03-22 57 views
0

Iam試圖爲我的節點js應用程序提供身份驗證。對於使用express-session npm的Iam。基本上我在嘗試的是當我的憑據在我的/登錄頁面中正確時。它應該啓動會話並帶我到/ admin頁面。所以/ admin可以在其他標籤中直接訪問一段時間。當我點擊註銷按鈕時,它應該帶我到主頁面,會話應該被取消,並且/ admin頁面不應該直接訪問並重定向到/登錄頁面。快速會話不能使用「錯誤:發送後無法設置標題」。

我試過在登錄成功時開始會話,但它給了我錯誤:發送後無法設置標題。

app.js

var session = require('express-session'); 
app.use(session({ 
    secret: 'securedsession', 
    resave: false, 
    saveUninitialized: true, 
    cookie: { 
     secure: true, 
     resave: true, 
     saveUninitialized: true, 
     maxAge: new Date(Date.now() + 3600000) 
    } 
})); 
var auth = function(req, res, next) { 
    if (req.session && req.session.user === "admin" && req.session.admin) 
     return next(); 
    else 
     return res.sendStatus(401); 
}; 
app.post('/verifylogin', function(req, res) { 
      var username = req.headers.uname; 
      var password = req.headers.pwd; 
      if (!username || !password) { 
       res.send('login failed'); 
      } else if (username === "admin" || password === "adminnn") { 
       req.session.user = "admin"; 
       req.session.admin = true; 
       res.contentType('application/json'); 
       var data = JSON.stringify('/admin'); 
       res.header('Content-Length', data.length); 
       res.send(data); 
      } 
      app.get('/logout', function(req, res) { 
       req.session.destroy(); 
       res.send("logout success!"); 
}); 

app.get('/admin', auth, function(req, res, next) { 
    res.sendFile(__dirname + '/public/views/admin.html'); 
}); 

的login.html

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> 
<script type="text/javascript"> 
function login() { 
    var uname = document.getElementById('uname').value; 
    var pwd = document.getElementById('pwd').value; 
    $.ajax({ 
     url: '/verifylogin', 
     type: "POST", 
     headers: { 
      "uname": uname, 
      "pwd": pwd 
     }, 
     success: function(data) { 
      window.location = data; 
     } 
    }); 
} 
</script> 
<h1>Login</h1> 
<p> 
    <label class="control-label">Username</label> 
    <input type="text" placeholder="Username" id="uname" /> 
</p> 
<p> 
    <label class="control-label">Password</label> 
    <input type="password" placeholder="Password" id="pwd" /><br/> 
</p> 
<p> 
    <button type="submit" class="btn btn-primary" onclick="login()">Login</button> 
</p> 

有人能幫我出了錯誤,我在做如有這裏如何解決這一問題,並開始會話

*********編輯

建議後的最新代碼,即使信用是正確的,它被重定向我未經授權,而不是,/管理員。可以ü看看

app.js

var app = express(); 
var d = new Date(); 
app.use(methodOverride()); 
app.use(cookieParser()); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ 
    extended: false 
})); 
app.use(session({ 
    secret: 'securedsession', 
    resave: false, 
    saveUninitialized: true, 
    cookie: { 
     secure: true, 
     resave: true, 
     saveUninitialized: true, 
     maxAge: d.getTime() + 10 
    } 
})); 
app.set('view engine', 'pug'); 
app.post('/verifylogin', function(req, res) { 
    var username = req.body.uname; 
    var password = req.body.pwd; 
    var uname = "admin"; 
    var pwd = "[email protected]"; 
    if (uname == username && pwd == password) { 
     console.log("success"); 
     req.session.user = "admin"; 
     req.session.admin = true; 
     req.session.save(); 
     console.log("resdasdasda", req.session); 
     res.contentType('application/json'); 
     var data = JSON.stringify('/admin'); 
     res.header('Content-Length', data.length); 
     res.send(data); 
    } else { 
     console.log("fail"); 
     res.send("Bad luck"); 
    } 
}); 
var auth = function(req, res, next) { 
    if (req.session && req.session.user === "admin" && req.session.admin) 
     return next(); 
    else 
     return res.sendStatus(401); 
}; 
app.get('/', function(req, res, next) { 
    res.sendFile(path.join(__dirname + '/public/views/home.html')); 
}); 
app.get('/login', function(req, res, next) { 
    res.sendFile(__dirname + '/public/views/login.html'); 
}); 
app.get('/admin', auth, function(req, res, next) { 
    res.sendFile(__dirname + '/public/views/admin.html'); 
}); 
app.get('/logout', function(req, res) { 
    req.session.destroy(); 
    res.send("logout success!"); 
}); 
module.exports = app; 

HTML

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> 
<script type="text/javascript"> 
function login() { 
    var uname = document.getElementById('uname').value; 
    var pwd = document.getElementById('pwd').value; 
    $.ajax({ 
     url : '/verifylogin', 
     type : "POST", 
     data : { 
     "uname":uname, 
     "pwd" :pwd 
     }, 
     success: function(data) { 
     window.location = data; 
     } 
     }); 
} 
</script> 
<h1>Login</h1> 
<p> 
    <label class="control-label">Username</label> 
    <input type="text" placeholder="Username" id="uname" /> 
</p> 
<p> 
    <label class="control-label">Password</label> 
    <input type="password" placeholder="Password" id="pwd" /><br/> 
</p> 
<p> 
    <button type="submit" class="btn btn-primary" onclick="login()">Login</button> 
</p> 
+0

你能否正確縮進你的問題中的代碼。它的方式實際上是不可讀的。 – jfriend00

+0

@ jfriend00我已經正確地縮進了。你看看,爲什麼它沒有帶我到/管理 – user7350714

回答

1

,當你有一個以上的你報告錯誤造成res.send()爲相同的請求。所以,你正在尋找可以導致這種情況的代碼。

當你的代碼的縮進正常部分,它看起來像這樣:

app.post('/verifylogin', function (req, res) { 
    var username = req.headers.uname; 
    var password = req.headers.pwd; 
    if (!username || !password) { 
     res.send('login failed'); 
    } else if (username === "admin" || password === "adminnn") { 
     req.session.user = "admin"; 
     req.session.admin = true; 
     res.contentType('application/json'); 
     var data = JSON.stringify('/admin'); 
     res.header('Content-Length', data.length); 
     res.send(data); 
    } 

    app.get('/logout', function (req, res) { 
     req.session.destroy(); 
     res.send("logout success!"); 
    }); 
}); 

這意味着你有一個app.post()這是從來沒有做的事情以正確的方式內部的app.get()。這將導致多個app.get('/logout')處理程序被安裝,因此您將嘗試多次執行/註銷請求res.send()

這應該是這樣的:

app.post('/verifylogin', function (req, res) { 
    var username = req.headers.uname; 
    var password = req.headers.pwd; 
    if (!username || !password) { 
     res.send('login failed'); 
    } else if (username === "admin" || password === "adminnn") { 
     req.session.user = "admin"; 
     req.session.admin = true; 
     res.contentType('application/json'); 
     var data = JSON.stringify('/admin'); 
     res.header('Content-Length', data.length); 
     res.send(data); 
    } 
}); 

app.get('/logout', function (req, res) { 
    req.session.destroy(); 
    res.send("logout success!"); 
}); 

根據您的修改,我會建議你避免任何形式的競爭狀態通過改變這個保存會話:

app.post('/verifylogin', function(req, res) { 
    var username = req.body.uname; 
    var password = req.body.pwd; 
    var uname = "admin"; 
    var pwd = "[email protected]"; 
    if (uname === username && pwd === password) { 
     console.log("success"); 
     req.session.user = "admin"; 
     req.session.admin = true; 
     req.session.save(() => { 
      console.log("resdasdasda", req.session); 
      res.json(data); 
     }); 
    } else { 
     console.log("fail"); 
     res.send("Bad luck"); 
    } 
}); 

除此之外,我唯一能想到的其他事情會導致你失去會話,就是瀏覽器會丟失會話cookie。您可以通過檢查Chrome調試器中的網絡選項卡來查看瀏覽器端是否正在發送期望的會話cookie,並請求/admin

+0

是的。謝謝。我發現Iam使用res.send()兩次刪除第一個的問題。但即使我的信譽是正確的。這是給未經授權..爲什麼你認爲這種行爲。它沒有帶我/管理 – user7350714

+0

我已經編輯了我的任務,並在最後添加了我的/管理..可以看看,並告訴我,如果有任何事情錯誤,因爲它給我未經授權 – user7350714

+0

@ user7350714 - 我們必須看到更多的代碼才能明白爲什麼會話無法正常工作。有些會話管理器要求你調用'req.session.save()',即使你有'resave:true'來讓會話改變爲stick。 – jfriend00

相關問題