『実践Node.jsプログラミング』(p.175〜)で写経してて、ちょっと面倒だったのでメモ。connectミドルウェアcookie-parserの話です。
一つは、connectでcookieParserを使うには、cookie-parserを入れなければならないこと。以前は組込みだったそうですが、現在はミドルウェアを個別にインストールする必要があります。
npm install cookie-parser
次のようなサンプルがあるのですが、知識不足のため署名付きクッキーの扱いがよくわかりませんでした。なので、cookie-parserとその依存モジュールのソースを読んで、とりあえず以下の方法で動作することを確認しました(他にもあるみたいですが、それは置いときます)。
まずは、サンプルサーバ。署名付きクッキーはreq.signedCookiesに入ってきます。
server.js
var connect = require('connect') , cookieParser = require('cookie-parser'); var app = connect() .use(cookieParser('mayuyu is a beautiful')) .use(function(req, res) { console.log(req.cookies); console.log(req.signedCookies); res.end('Hello, Mayuyu\n'); }) .listen(3000);
サンプルサーバを起動。
node-dev server.js
サンプルサーバにリクエストするのに先立って、署名を作成します。Node.jsのcryptoモジュールを使用して、sha256ハッシュ、base64エンコードを指定してHMACを生成します(HMAC-SHA256)。createHmac()に渡すシークレット文字列は、サーバでcookieParser()に渡したものを指定します。update()に渡す値は、後でリクエスト時に指定するクッキーの値です。JSONクッキーを扱う場合は、’j:’で始まるJSONオブジェクトの文字列表現自体を値として指定します。
sha256hmac.js
var crypto = require('crypto'); console.log(crypto.createHmac('sha256', 'mayuyu is a beautiful').update('mayuyu').digest('base64')); console.log(crypto.createHmac('sha256', 'mayuyu is a beautiful').update('j:{"name":"mayuyu"}').digest('base64'));
実行結果をコピペします(末尾の’=’は除きます)。
node sha256hmac.js => EBUDzQoQU9FvPILRnmW2W+y0R5JUD43TQUQ00feOaJg= => LdouC1l19fzQ233pNKRrKsfQkcaJXDhRg9rpf+r+Jm4=
curlで実行確認します。これで、req.signedCookies側に入ってきます。
値の前に、’s:’を付記しているのに注意してください。その後に、値と署名をピリオド’.’で挟んだ形で指定します。JSONクッキーの場合は、’j:’で始まるその指定全体を’s:’と’.’署名で挟み込むような形で内包させます。
curl http://localhost:3000/ -H "Cookie:name=s:mayuyu.EBUDzQoQU9FvPILRnmW2W+y0R5JUD43TQUQ00feOaJg" curl http://localhost:3000/ -H 'Cookie:akb48=s:j:{"name":"mayuyu"}.LdouC1l19fzQ233pNKRrKsfQkcaJXDhRg9rpf+r+Jm4'