【问题标题】:Error: cookieParser("secret") required for signed cookies错误:签名 cookie 需要 cookieParser("secret")
【发布时间】:2019-04-14 08:52:47
【问题描述】:

我正在研究 express/node.js 并试图了解 expressjs 的 cookie,我正在设置这样的 cookie:

var express = require('express');
var app = express();
var cookieParser = require('cookie-parser');
app.use(cookieParser());

app.get('/', function(req, res){
    res.cookie('cookie1', 'This is my first cooke', {maxAge: 1000*60*60*24*7, httpOnly: true});
    res.end('Cookie has been set');
});

并按如下方式访问 cookie:

app.get('/readCookies',function(req, res){
    res.send(req.cookies.cookie1);
});

但问题是signed: true 选项在设置 cookie 期间包含此选项用于编码 cookie 值时,我收到以下错误:

Error: cookieParser("secret") required for signed cookies

请帮助我并提前感谢

【问题讨论】:

标签: node.js express cookies


【解决方案1】:

错误解释了您需要做什么才能发送签名的 cookie:

错误:签名 cookie 需要 cookieParser("secret")

Express documentation 声明:

当使用cookie-parser中间件时,该方法也支持签名cookies。只需将signed 选项设置为true。然后res.cookie() 将使用传递给cookieParser(secret) 的秘密对值进行签名。

cookie-parser 文档指出:

cookieParser(secret, options)

  • secret 用于签署 cookie 的字符串或数组。这是可选的,如果未指定,将不会解析签名的 cookie。如果提供了字符串,则将其用作秘密。

所以一切都结合起来了:

  • 安装cookie-parser中间件:

    npm install cookie-parser
    
  • 将其添加到 Express 应用中:

    const cookieParser = require('cookie-parser');
    
    ...
    app.use(cookieParser('MY SECRET'));
    
  • 让它签署cookies:

    res.cookie('cookie1', 'This is my first cookie', { signed : true });
    
  • 并读回 cookie 值:

    res.send(req.signedCookies.cookie1);
    

【讨论】:

  • 直到我读到这个问题,我才真正理解 cookie 和签名的 cookie 是怎么回事。 My notes...
【解决方案2】:

如果您设置signed:true 选项,您必须将密钥设置为字符串作为cookieParser() 的参数,如下所示:

var express = require('express');
var app = express();
var cookieParser = require('cookie-parser');
//Set secret key
app.use(cookieParser('your random secret string here'));

//Set/Write Cookies
app.get('/',function(req, res){
    res.cookie('cookie1', 'This is my first cookie', {signed:true, maxAge: 1000*60*60*24*7, httpOnly: true});
    res.end('Cookie has been set');
});

否则就留空如下:

app.use(cookieParser());

要访问签名的cookie值,您可以尝试如下:

//Read Cookies
app.get('/readCookies',function(req, res){
    res.send(req.signedCookies['cookie1']);
    //OR, req.signedCookies.cookie1
});

或者,如果您没有设置httpOnly: true 选项,您可以从浏览器控制台检查cookies,如下所示:

document.cookie

要销毁 cookie,请尝试以下操作:

//Remove Cookies
app.get('/removeCookies',function(req, res){
    res.clearCookie('cookie1');
    res.send("Cookie has been cleared");
});

更多详情请查看res.cookie(name, value [, options])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 2015-06-01
    • 2011-11-14
    • 1970-01-01
    • 2016-06-07
    • 2013-02-17
    • 1970-01-01
    相关资源
    最近更新 更多