📜  Express Cookie-Parser – 签名和未签名的 Cookie

📅  最后修改于: 2022-05-13 01:56:20.825000             🧑  作者: Mango

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' }