Express Cookie-Parser – 签名和未签名的 Cookie
cookie 是通过请求发送到客户端的一段数据,并由用户当前使用的 Web 浏览器存储在客户端本身。在 cookie 的帮助下——
- 网站很容易记住用户的信息
- 轻松捕捉用户浏览历史
- 它在存储用户会话时也很有用
会话使用秘密 ID 向所有服务器发出请求。该信息存储在链接到此秘密 ID 的服务器上。
为了在我们的应用程序中使用 cookie,使用了cookie-parser 中间件。要安装它,请编写以下命令 -
npm install cookie-parser@latest --save
此外,要安装express 中间件,请编写以下命令 -
npm install express@latest --save
这些命令将安装最新版本的 cookie-parser 和 express。
Cookie-parser 中间件用于解析附加到客户端向服务器发出的请求的 cookie。因此,要使用 cookie-parser,我们将在 JavaScript 文件中编写以下代码行——
const cookieParser = require('cookie-parser');
const express = require('express')
const app = express();
app.use(cookieParser());
让我们看一个如何设置新 cookie 的示例。创建一个名为“index.js”的新文件。要为 cookie 设置和分配名称,请遵循以下代码 -
const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();
app.get('/', (req, res) => {
res.cookie('name', 'GeeksForGeeks').send('Cookie-Parser');
});
app.listen(3000, (err) => {
if(err){ console.log(err) }
else { console.log('Success!!') }
});
在这里,我们将 cookie 发送到新路由并将 cookie 的名称设置为“GeeksForGeeks”。在最后一段代码中,我们的服务器正在使用回调函数监听 3000 端口。如果出现错误,则回调函数将返回错误,否则将返回“Success”。
现在,使用命令运行以下代码 -
node index.js
要检查是否设置了 cookie,只需在成功设置服务器后转到此链接。打开控制台并将命令编写为 -
document.cookie
你会得到输出——
"name=GeeksForGeeks"
此外, cookie-parser 中间件使用发送到服务器的名称填充req.cookies 。在这里,在我们的例子中,我们可以在我们的路由中添加以下代码行 -
console.log(req.cookies)
上述行的输出将是 -
{ name: 'GeeksForGeeks' }
cookie解析器的方法
- cookieParser(秘密,选项)
– 这个中间件有两个参数。第一个将是秘密 ID,其他将是选项。秘密 ID 可以是字符串或字符串数组。如果没有提供 secret 参数,那么它将把 cookie 当作unsigned cookie 。因此,提供秘密 ID 是可选的。第二个参数将是一个对象,指定要对 cookie 采取的操作。例如, decode是一个对 cookie 的值进行解码的函数。
- cookieParser.JSONCookie(str)
– 此方法会将 cookie 的值解析为 JSON cookie。如果提供的 cookie 是 JSON cookie,它将返回解析的 JSON 值。如果不是 JSON cookie,它将返回传递的值本身。
- cookieParser.JSONCookies(cookies)
– 提供了一个附加了 ID 的对象。此方法将遍历提供的对象 ID,并在每个值上调用“JSONCookie”。它将用解析的值替换原始值。这将返回传入的相同对象。
- cookieParser.signedCookie(字符串,秘密)
– 此方法将 cookie 解析为签名 cookie。如果 cookie 是签名的 cookie 并且签名可以被验证,那么它将返回解析后的无符号值。如果 cookie 未签名,则返回原始值。如果 cookie 已签名但无法验证签名,则返回false 。
现在,我们的第二个参数secret可以是一个字符串或一个字符串数组。如果它是一个字符串,那么它将被用作一个秘密。如果它是一个数组,那么将对数组的每个元素进行迭代,并且将使用每个秘密对 cookie 进行无符号化。 - cookieParser.signedCookies(cookies,秘密)
– 此方法将对每个 ID 执行迭代,并检查是否有任何 ID 是签名的 cookie。如果已签名并且可以验证签名,则 ID 将从对象中删除,并将添加到新的返回对象中。
根据从客户端发送的 cookie 的类型,将自动调用这些方法。
有符号和无符号 Cookie 的实现
未签名的 Cookie
const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();
app.get('/', (req, res) => {
res.cookie('name', 'GeeksForGeeks').send();
console.log(req.cookies);
});
app.listen(3000, (err) => {
if(err){ console.log(err) }
else { console.log('Success!!') }
});
上述代码的输出将是 -
"name=GeeksForGeeks"
签名的 Cookie
var express = require('express')
var cookieParser = require('cookie-parser')
var app = express()
app.use(cookieParser('GFG'))
app.get('/', function (req, res) {
res.cookie('name', 'GeeksForGeeks', { signed: true }).send();
console.log(req.signedCookies)
})
app.listen(3000, (err) => {
if(err) { console.log(err) }
else { console.log('Success') }
})
在这里,在第 4 行——“GFG”作为秘密值提供给 cookie。
在第 7 行 - cookie 的名称设置为“GeeksForGeeks”,签名的对象设置为 true。
上述代码的输出将是 -
{ name: 'GeeksForGeeks' }