Tsa*_*mba 2 javascript ajax jquery node.js express
仔细观察并尝试了我在这里找到的所有东西,以及Googling在其他地方找到的东西......而我却无法超越这个.我正在使用Node,Express,EJS,并尝试在表单上使用csurf,这是使用jQuery ajax发布的.无论我如何配置csurf,我都会得到"403(Forbidden)无效的csrf令牌"
我尝试在app.js和控制器中全局配置.这是我在app.js中尝试的内容:
var express = require('express');
var session = require('express-session');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var mysql = require('mysql');
var flash = require("connect-flash");
var csrf = require("csurf");
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(logger('dev'));
app.use(cookieParser());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(session({
secret: 'somethingsecret',
resave: true,
saveUninitialized: true,
httpOnly: true,
secure: false
}));
app.use(csrf());
app.use(function (req, res, next) {
var token = req.csrfToken();
res.cookie('XSRF-TOKEN', token);
res.locals.csrfToken = token;
console.log("csrf token = " + token);
next();
});
app.use(flash());
app.use(express.static(path.join(__dirname, 'public')));
app.use(function (err, req, res, next) {
if (err.code !== 'EBADCSRFTOKEN') return next(err);
// handle CSRF token errors here
res.status(403);
res.send('form tampered with');
})
//routing
var routes = require('./routes/index');
var users = require('./routes/users');
var register = require('./routes/register');
app.use('/', routes);
app.use('/users', users);
app.use('/register', register);
Run Code Online (Sandbox Code Playgroud)
...使用此控制器:
var express = require("express");
var router = express.Router();
var bodyParser = require("body-parser");
var userSvc = require("../service/userservice");
var jsonParser = bodyParser.json();
router.get("/", function(req, res, next) {
console.log("token = " + token);
userSvc.getAllPublicRoles(function(data) {
res.render("register", {
title: "Register a new account",
roles: data
});
});
});
router.post("/new", jsonParser, function(req, res, next) {
userSvc.addUser(req.body, function(result) {
console.log("New user id = " + result.insertId);
res.send('{"success" : "Updated Successfully", "status" : 200}');
});
});
Run Code Online (Sandbox Code Playgroud)
......而且这个观点:
形成:
<form id="registerForm" class="form-horizontal" method="post">
<input type="hidden" name="_csrf" value="<%= csrfToken %>" />
Run Code Online (Sandbox Code Playgroud)
ajax电话:
$.ajax({
url: "/register/new",
type: "POST",
dataType: "json",
data: user
}).done(function(data) {
if (data) {
console.log("Success! = " + data);
}
}).fail(function(data) {
console.log("Something went wrong: " + data.responseText);
});
Run Code Online (Sandbox Code Playgroud)
然后我只是尝试在控制器中执行所有操作,从app.js中删除所有引用,调用等,并使用与上面相同的表单和ajax调用:
var express = require("express");
var router = express.Router();
var bodyParser = require("body-parser");
var csrf = require("csurf");
var userSvc = require("../service/userservice");
var csrfProtection = csrf();
var jsonParser = bodyParser.json();
router.get("/", csrfProtection, function(req, res, next) {
var token = req.csrfToken();
console.log("token = " + token);
userSvc.getAllPublicRoles(function(data) {
res.render("register", {
title: "Register a new account",
csrfToken: token,
roles: data
});
});
});
router.post("/new", jsonParser, csrfProtection, function(req, res, next) {
userSvc.addUser(req.body, function(result) {
console.log("New user id = " + result.insertId);
res.send('{"success" : "Updated Successfully", "status" : 200}');
});
});
Run Code Online (Sandbox Code Playgroud)
不知道从哪里开始.在业余时间,我一直在使用节点大约两个星期,所以请原谅我的无知.
如果您想将令牌存储在cookie而不是会话中,请让csurf为您创建cookie,例如
// Store the token in a cookie called '_csrf'
app.use(csrf({cookie: true));
// Make the token available to all views
app.use(function (req, res, next){
res.locals._csrf = req.csrfToken();
next();
});
Run Code Online (Sandbox Code Playgroud)
然后,当您使用AJAX通过POST数据或作为自定义请求标头(如"xsrf-token")进行呼叫时,您需要确保令牌可用.
在那一刻,您将向表单提供令牌,但不是实际请求(使用AJAX发送).
例如,您可以在AJAX设置中呈现令牌:
$.ajaxSetup({
headers: {"X-CSRF-Token": "{{csrfToken}}" }
});
Run Code Online (Sandbox Code Playgroud)