2017-10-21 138 views
0

我正在使用NodeJS构建一个应用程序单页,并且想要使用我的cookie会话(cookie-session npm)来验证用户是否已登录。从我的节点服务器端我可以获取并设置会话cookie,但我不知道如何从客户端获得。如何从客户端访问Cookie会话?

这是我如何从我的服务器端设置:

req.session.user_id = user[0]._id; 

哪里user[0]._id我的用户ID,我从我的MongoDB得到。

回答

4

因此,让我们假设你已经配置cookie-session是这样的:

var cookieSession = require('cookie-session'); 

app.use(cookieSession({ 
    keys: ['secret'] 
})); 

然后让一些数据存储在会话:

req.session.user_id = 123; 

如果你在浏览器的开发工具看你会见2组曲奇:

express:sess = eyJ1c2VyX2lkIjoxMjN9 
express:sess.sig = 01I_Rx2gACezZI1tdl2-NvxPq6w 

曲奇express:sess是base64编码的。如果我们解码它,我们得到{"user_id":123}。了解会话数据存储在cookie本身是非常重要的 - 这不仅仅是会话的ID。

其他cookie,express:sess.sig是签名。此签名是使用密钥生成的(本例中为secret),用于帮助防止篡改。任何人都可以轻松修改express:sess,但除非他们也可以生成相应的express:sess.sig,否则服务器将知道它已被更改。

所有这一切说,我建议你看看express-session中间件。这也使用cookies,但它只使用它们来存储会话ID。没有数据存储在cookie中,全部存储在服务器上。这更类似于会话在大多数其他Web框架中的工作方式,但我无法确定哪种方法最适合您的需求。

默认情况下,无论您使用cookie的方式是否设置为httponly。您将能够在浏览器的开发工具中验证这一点。这意味着它包含在HTTP请求中,但不能通过客户端JavaScript访问。这是一种安全措施,旨在使恶意代码更难以窃取cookie。您可以使用cookie-session禁用此安全功能:

app.use(cookieSession({ 
    httpOnly: false, 
    keys: ['secret'] 
})); 

然后您就可以访问使用document.cookie这些cookie。

我重申这是一项安全措施,不推荐将其关闭。我不可能判断这是否是您应用程序中的真正关注点。

从您的问题中不清楚您是否真的想要从cookie中解析出值或仅检查其存在。如果你需要解析它,那么你需要base64解码相关的cookie值,然后JSON解码它。

您可能会采用各种替代方法来保留Cookie httponly。在不了解你将如何处理这些信息的情况下,它很难具体。如果您使用Express视图(即模板呈现),那么您可以完成模板中的所有工作。如果您处于SPA领域,那么您可以使用AJAX请求收集相关信息。无论如何,您甚至可以使用另一个cookie为您提供所需的信息,同时保持会话cookie安全。

0

会话是一个服务器的事情,你不能在客户端访问它,如果你的意思是cookie,那么cookie不包含关于会话的任何事情,但是一个ID指向它。如果您想从客户端的会话获取信息,则必须创建一个请求,然后服务器将会话信息发回。

+0

他正在讨论'cookie-session'软件包,它会将会话数据解密/密码并将其存储在客户端设备上 – num8er