2017-02-26 79 views
0

我試圖在登錄時設置cookie,但該cookie似乎不遵循下一個請求。我究竟做錯了什麼? (對不起,如果沒有問題,表達很新)。會話cookie未在下一個請求中設置 - Express.js

的app.js

let express = require("express"); 
let session = require("express-session"); 
let bodyParser = require("body-parser"); 

app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({extended: true})); 
app.use(session({ 
    secret: "secret", 
    resave: false, 
    saveUninitialized: false, 
    cookie: { secure: true } 
})); 

路由器

router.route("/login") 
    .get(function(request, response) { 

     response.render("../views/partials/login"); 
    }) 

    .post(function(request, response) { 

     let username = request.body.username; 
     let password = request.body.password; 

     User.findOne({user: username}, function(err, user) { 
      if (err) { 
       // Some error handling 
      } 

      // test password if matching 
      if (user !== null) { 
       user.comparePassword(password, function(err, match) { 
        if (err || !match) { 
         console.log("The user could not be found") 
        } 

        request.session.Auth = { username: username, password: password }; 
        response.redirect("/home"); 
        response.end(); 
       }); 
      } else { 
       // some error handling 
      } 
     }); 

    }); 

後來,當我做 「/家」 的下一個請求,會話cookie保存沒有關於用戶(REQ值。 session.Auth返回undefined

router.route("/home") 
    .get(restrict, function(req,res) { 

console.log(req.session.Auth) // -> undefined 
     res.render("../views/home") 
    }); 

也許我在做這個錯誤,但我不明白爲什麼request.session不包含Auth值。有人可以幫忙嗎?

P.S.我不想使用任何模塊來處理授權,例如護照等。

回答

0

你正在做的事情是行不通的。

我真的推薦你使用passport.js進行驗證。這很簡單,並且帶走了你現在正在做的大量工作。在這個帖子請求中訪問請求對象什麼都不做。

+0

忘了補充一點,我不想用passport.js來完成學習目的:)。但爲什麼它不工作? – Jesper

+0

請求對象具有與客戶端發出的請求有關的數據。客戶返回的唯一東西是響應,請求不會返回給客戶端。 – paqash

+0

你可以發送session-cookie作爲迴應嗎? – Jesper

0

請試試這個方法。快遞

app.use(express.cookieParser('S3CRE7')); 
app.use(express.cookieSession({ 
    key: 'app.key', 
    secret: 'app.secret' 
})); 
app.use(app.router); 

第一個啓用的Cookie會話的cookie會議結束後,你可以得到/設置的request.session什麼都好。

我認爲你的邏輯其餘部分是好的。

+0

不適用於快遞4 ^,退貨:大多數中間件(如cookieParser)不再與Express捆綁在一起,必須單獨安裝。請參閱https://github.com/senchalabs/connect#middleware。 – Jesper

+0

因此,我們可以將該中間件導入到項目中。 – kamprasad

0

您是否使用HTTPS測試您的應用程序?如果沒有,那麼你應該初始化沒有cookie: { secure: true }財產快遞會話,如

app.use(session({ 
    secret: "secret", 
    resave: false, 
    saveUninitialized: false 
})); 

安全cookie是使用HTTPS時將只發送的cookie。