JavaScriptとExpressでcsrfがうまく動作しないです。
うまくいけばejsで書いた部分が表示されるはずなのですが'req.csrfToken() is not a function'と言う表示が出てしまいます。
npm i mongoose csurf express-session method-override connect-flash --s
で必要なものはインストールしました。
app.js
javascript
1require('./db/mongo'); 2 3const createError = require('http-errors'); 4const express = require('express'); 5const path = require('path'); 6const cookieParser = require('cookie-parser'); 7const logger = require('morgan'); 8 9const session = require("express-session"); 10const csurf = require("csurf"); 11const mongoose = require("mongoose"); 12const flash = require("connect-flash"); 13const methodOverride = require("method-override"); 14const bodyParser = require('body-parser'); 15 16const indexRouter = require('./routes/index'); 17const usersRouter = require('./routes/users'); 18 19const app = express(); 20 21mongoose.connect('mongodb://localhost/practice'); 22 23// view engine setup 24app.set('views', path.join(__dirname, 'views')); 25app.set('view engine', 'ejs'); 26 27app.use(logger('dev')); 28app.use(express.json()); 29app.use(bodyParser.json()); 30app.use(express.urlencoded({ extended: false })); 31app.use(bodyParser.urlencoded({ extended: false })); 32app.use(cookieParser()); 33app.use(express.static(path.join(__dirname, 'public'))); 34 35app.use('/', indexRouter); 36app.use('/users', usersRouter); 37 38// catch 404 and forward to error handler 39app.use(function(req, res, next) { 40 next(createError(404)); 41}); 42 43// error handler 44app.use(function(err, req, res, next) { 45 // set locals, only providing error in development 46 res.locals.message = err.message; 47 res.locals.error = req.app.get('env') === 'development' ? err : {}; 48 49 // render the error page 50 res.status(err.status || 500); 51 res.render('error'); 52}); 53 54 55app.use(methodOverride(function(req, res){ 56 if( req.body && typeof req.body === "object" && "_method" in req.body ){ 57 const method = req.body._method; 58 delete req.body._method; 59 return method; 60 } 61})); 62 63app.use(session({ 64 secret: 'a', 65 resave: false, 66 saveUninitialized: false, 67 cookie: { 68 httpOnly: true, 69 secure: true, 70 maxage: 1000 * 60 * 30 // 30 minutes 71 } 72})); 73app.use(csurf()); 74app.use(flash()); 75 76module.exports = app; 77
index.js
javascript
1router.get('/new', function (req, res) { 2 res.render('new', { 3 title: 'Add message', 4 reqCsrf: req.csrfToken(), 5 }) 6});
index.ejs
javascript
1<form action="/create" method="post"> 2 <input type="hidden" name="_csrf" value="<%= reqCsrf %>"> 3 <p> 4 <input type="text" name="title" value="" size="60"> 5 <% if( errors && errors.title ){ %> 6 <strong><%= errors.title.message %></strong> 7 <% } %> 8 </p> 9 <p><textarea name="contents" cols="60" rows="12"></textarea></p> 10 <p><button type="submit">Create</button></p> 11</form>
どのようにすれば動くようになるでしょうか?
できればコードの大きな改変をせずに動作させるようにしたいです。
回答1件
あなたの回答
tips
プレビュー