2017-03-22 3 views
0

Ich versuche, Authentifizierung für meine Knoten js-Anwendung bereitzustellen.Für, dass ich Express-Sitzung npm.Basisch was ich versuchte, wenn ich wenn meine Anmeldeinformationen in meiner/Login-Seite korrekt sind. Es sollte die Sitzung starten und mich zu/admin page.So dass/admin wird für einige Zeit in anderen Tabs direkt zugänglich sein. Und wenn ich auf Abmelden Button klicke, sollte es mich auf die Hauptseite bringen und Sitzung sollte abgebrochen werden und/Admin-Seite sollte nicht direkt zugänglich sein und Redirect zu /Loginseite.Express-Sitzung funktioniert nicht mit "Fehler: Kann Header nicht festlegen, nachdem sie gesendet werden."

Ich habe versucht, die Sitzung zu starten, wenn die Anmeldung erfolgreich ist, aber es gibt mir den Fehler: Kann Header nicht festlegen, nachdem sie gesendet werden.

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> 

Kann mir jemand helfen, den Fehler heraus, dass ich wenn überhaupt hier und wie zu tun, dies zu beheben und starten Sie die Sitzung

********* bearbeitet

neuesten Code nach den Vorschlägen, auch die Kredits richtig sind, es ist mir nicht autorisierte Umleitung statt,/admin .can u haben einen Blick

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

Können Sie bitte den Code in Ihrer Frage richtig einrücken. Es ist wirklich nicht lesbar, wie es ist. – jfriend00

+0

@ jfriend00 Ive eingerückt richtig.Kannst du einen Blick, warum es mich nicht zu/admin – user7350714

Antwort

1

Der Fehler melden verursacht wird, wenn Sie mehr als eine haben app.js res.send() für die gleiche Anfrage. Sie suchen nach etwas in Ihrem Code, das das verursachen kann.

Wenn Sie richtig Einzug Teil des Codes, sieht es wie folgt aus:

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!"); 
    }); 
}); 

Das bedeutet, Sie haben einen app.get() innerhalb eines app.post(), die nie der richtige Weg ist, die Dinge zu tun. Dies wird dazu führen, dass mehrere app.get('/logout') Handler installiert werden und Sie werden versuchen, res.send() mehrere Male für eine/Logout-Anfrage zu tun.

Dies sollte so aussehen:

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!"); 
}); 

Basierend auf Ihre Bearbeitungen, würde ich Sie jede Art von Race-Bedingung vermeiden vorschlagen mit der Sitzung zu speichern, indem auf diese Veränderung:

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"); 
    } 
}); 

Abgesehen davon, die einzige andere Sache, die ich denken könnte, dass Sie verlieren Ihre Sitzung wäre der Browser verlieren die Sitzung Cookie. Sie können dies auf der Browserseite überprüfen, indem Sie im Chrome-Debugger die Registerkarte "Netzwerk" prüfen und feststellen, ob der gewünschte Sitzungscookie mit der Anforderung /admin gesendet wird.

+0

Yes .Thanks.Ich habe das Problem, dass ich benutze res.send() zweimal entfernt die erste .. Aber obwohl meine Creds sind richtig.es gibt nicht autorisierte ... warum denkst du dieses Verhalten.Es bringt mich nicht zu/Admin – user7350714

+0

Ich habe meine Suche bearbeitet und meine/admin am Ende hinzugefügt .. können Sie einen Blick und PLZ sagen mir, wenn etwas ist falsch, da es mich unautorisiert gibt – user7350714

+0

@ user7350714 - Wir müssten mehr von Ihrem Code sehen, um eine Idee zu haben, warum Ihre Sitzung nicht funktioniert. Einige Sitzungsmanager erfordern, dass Sie 'req.session.save()' aufrufen, obwohl Sie 'resave: true' haben, damit die Sitzungsänderungen beibehalten werden. – jfriend00

Verwandte Themen