昨日の続き。express.csrf undefind問題の再現方法がようやくわかりました。Safariだけ。5.1.1をアップデートして5.1.3でも同様。
- Safari起動
- メニューから[Safari]→[Safariをリセット]→[リセット]
- https://localhost:3000/login にアクセス → session.csrf が発行される。
- ログインしてログアウト。
- ログイン画面 → session.csrf が undefined。以降ずっと。
- 再びリセットすると、最初の1回だけ session.csrf が発行されるも、3.と全く同じ値のcsrf。
やってみたこと
- logout時に session.destroy → NG
- 1.のとき、然るべきときに session.regenerate → NG
- logout時に session.user だけ undefined設定 → OK
- 3.のとき、session._csrf は 固定値になっている。そもそもChromeも。
もう眠いので推測。destoryやregenerateの挙動がブラウザで違うのは、HTTPヘッダがなんか足りない。session._csrf固定値なのは、express.csrf が static か singleton か ランダムじゃないのでは、と。この視点で明日コールドリーディングするか。
今日のコード
app.coffee
fs = require('fs') express = require("express") routes = require("./routes") mongoose = require('mongoose') app = module.exports = express.createServer key:fs.readFileSync 'key.pem' cert:fs.readFileSync 'cert.pem' app.configure -> app.register ".coffee", require("coffeekup").adapters.express app.set "views", __dirname + "/views" app.set "view engine", "coffee" app.use express.cookieParser() app.use express.session secret: "your secret here" cookie: { secure: true } app.use express.bodyParser() app.use express.query() app.use express.methodOverride() app.use app.router app.use express.static(__dirname + "/public") app.use express.csrf() app.dynamicHelpers token:(req, res) -> console.log(req.session._csrf) return req.session._csrf app.configure "development", -> mongoose.connect 'mongodb://localhost/sample' app.use express.errorHandler( dumpExceptions: true showStack: true ) app.configure "production", -> mongoose.connect 'mongodb://localhost/sample' app.use express.errorHandler() app.get "/", routes.index app.get "/login", routes.login app.post "/login", routes.authenticate app.get "/secret", routes.secret app.get "/signup", routes.signup app.post "/signup", routes.regist app.get "/logout", routes.logout app.listen 3000 console.log "Express server listening on port %d in %s mode", app.address().port, app.settings.env
routes/index.coffee(logoutのところ)
logout: (req, res, next) -> req.session.user = undefined res.redirect '/'
0 件のコメント:
コメントを投稿