Node.js实战关于cookie-parser中间件

最近在kindle上看Node.js实战这本书的电子版,书的内容虽然已经旧了但是概念和条理还是比较清晰,但是说实话电子版是不是错太多了点儿..照着例子打一遍基本上都要改改才能对(不得不说也是一种锻炼- -)

然后看到connect讲cookie签名和解析这里,首先现在connect已经不支持connect.cookieParser(),需要单独下载(npm install cookie-parser)

因为我之前没有任何webservice开发的经验,所以虽然概念大概知道,但是不是很能融会贯通,不过还好我有追根刨底的习惯(- -#)


本书对于签名和解签讲的非常不清楚,且不说现在connect已经不支持cookieParser,对于如何签名如何解签也说的不清不楚,百度也根本找不到我想要的答案,于是只好自己去读cookie-parser的源代码了

看了源代码大概理清楚了


cookieParser()实际上是对http传入的cookie进行解析后赋值给req.cookies,使得中间件可用,如果你传入了一个string类的参数那么说明你需要对用这个参数进行了加密的值进行解密(注意!这个方法不是加密是解密!)并且要求传入的cookie加密值必须以s: 这个形式开头(这是本书没有提到的,可能独立出来的cookieParser有改动)


加密是用的base64,这个不重要,加密的这个方法其实也提供了的,就在cookieParser下面的cookie-signature下面的sign方法。

好了那么怎么来验证我看的是对的并且我的推论也是对的呢我写了一个很简单的小程序


var connect = require ('connect');
var cookieParser = require('cookie-parser');
var signature = require('cookie-parser/node_modules/cookie-signature');
var app = connect();
//console.log(signature.sign("eliza","eliza is smart"));
app.use(cookieParser("eliza is smart"));
app.use(function(req,res,next){
console.log(req.cookies);
console.log(req.signedCookies);
res.end('hello\n');
});
app.listen(3000);


看我注释掉的那行代码,我首先用这个方法算出我要传入的cookie加密后的值 eliza.3tUyvSRf3hxFyF6CbmnOB71IztFkxzUayTu/hGELIC4

然后运行以上代码后

用C:\project>curl http://localhost:3000 -H "Cookie: name = s:eliza.3tUyvSRf3hxFyF6CbmnOB71IztFkxzUayTu/hGELIC4" 这个命令行实验我的想法 (curl请自行下载和查看使用方法)


得到如下结果

{}
{ name: 'eliza' }


好了,这说明我的结论是正确的,中间件cookieParser正确的解密了我的加密cookie,并且赋值给了req.signedCookies..

你还可以试试,如果你改动一下eliza.3tUyvSRf3hxFyF6CbmnOB71IztFkxzUayTu/hGELIC4 这个值

你会得到如下结果

{}
{ name: false }


中间件无法正确解析,这就避免了cookie被篡改的可能性


最后注意一定要有s:如果没有 xx.xxxxx这样的写法会被认为是普通cookie而被赋值给req.cookies


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值