Недопустимый токен с использованием примера промежуточного ПО expressjs csurf

Я пробовал использовать пример csurf expressjs из https://github.com/expressjs/csurf При использовании В первом примере в файле Readme (с использованием языка шаблонов Ejs) проверка токена работает нормально. Когда я пытаюсь использовать пример «Игнорирование маршрутов» при выполнении «GET/form» для «POST/process» (как и в первом примере), я получаю «недопустимый токен» в «POST/process». Токен передается в форму по запросу GET. Любые идеи?

Приложение «app.use (csrfProtection)» не работает? (используется в нерабочем примере, если я удаляю «use (csrfP..» и использую методологию из рабочего примера для использования модуля csrf, IE, передавая «csrfProtection» в методы «get» и «post», второй пример работает)

Работает:

var cookieParser = require('cookie-parser')
var csrf = require('csurf')
var bodyParser = require('body-parser')
var express = require('express')

// setup route middlewares
var csrfProtection = csrf({ cookie: true })
var parseForm = bodyParser.urlencoded({ extended: false })

// create express app
var app = express()

app.set('view engine', 'ejs')

// parse cookies
// we need this because "cookie" is true in csrfProtection
app.use(cookieParser())

app.get('/form', csrfProtection, function(req, res) {
  // pass the csrfToken to the view
  var tkn = req.csrfToken()
  console.log(tkn)
  res.render('index', { csrfToken: tkn })
})

app.post('/process', parseForm, csrfProtection, function(req, res) {
  res.send('data is being processed')
})

var server = app.listen(8081, function () {

  var host = server.address().address
  var port = server.address().port

  console.log("Example app listening at http://%s:%s", host, port)

})

html/ejs:

<!DOCTYPE html>  
<html lang="en">  
  <head>
  </head>
  <body>
    <form action="/process" method="POST">
        <input type="hidden" name="_csrf" value="<%= csrfToken %>">
        Favorite color: <input type="text" name="favoriteColor">
        <button type="submit">Submit</button>
    </form>
  </body>
</html>  

Не работает:

var cookieParser = require('cookie-parser')
var csrf = require('csurf')
var bodyParser = require('body-parser')
var express = require('express')

// setup route middlewares
var csrfProtection = csrf({ cookie: true })
var parseForm = bodyParser.urlencoded({ extended: false })

// create express app
var app = express()

app.set('view engine', 'ejs')

// parse cookies
// we need this because "cookie" is true in csrfProtection
app.use(cookieParser())

// create api router
var api = createApiRouter()

// mount api before csrf is appended to the app stack
app.use('/api', api)

// now add csrf, after the "/api" was mounted
app.use(csrfProtection)

app.get('/form', function(req, res) {
  // pass the csrfToken to the view
  var tkn = req.csrfToken()
  console.log(tkn)
  res.render('index', { csrfToken: tkn })
})

app.post('/process', parseForm, function(req, res) {
  res.send('csrf was required to get here')
})

function createApiRouter() {
  var router = new express.Router()

  router.post('/getProfile', function(req, res) {
    res.send('no csrf to get here')
  })

  return router
}

var server = app.listen(8081, function () {

  var host = server.address().address
  var port = server.address().port

  console.log("Example app2 listening at http://%s:%s", host, port)

})

person mmmlll lis    schedule 10.02.2016    source источник


Ответы (1)


Во втором примере вы не передаете промежуточное ПО csrfProtection в цепочку обработки POST. Так должно быть

app.post('/process', parseForm, csrfProtection, function(req, res) {
  res.send('csrf was required to get here')
})
person Jerome Anthony    schedule 10.02.2016
comment
Во втором примере: не отменяет ли строка app.use(csrfProtection) необходимость включения csrfProtection в обработчик маршрута? - person mmmlll lis; 11.02.2016