昨日の続き。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 件のコメント:
コメントを投稿