【发布时间】:2017-12-28 13:39:51
【问题描述】:
我在我的项目中使用csurf 库,但它不起作用。这是我的代码:
server.js
var express = require('express');
var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser');
var csrf = require('csurf');
var line = require('./server/line');
app.use(cookieParser());
var csrfProtection = csrf({ cookie: true})
app.use(csrfProtection, function(req, res) {
res.cookie('XSRF-TOKEN', req.csrfToken());
});
app.use(function (err, req, res, next) {
if (err.code !== 'EBADCSRFTOKEN') return next(err)
res.status(403)
res.send('form tampered with')
})
app.post('/getAccessTokenLINE', line.getAccessToken);
auth.js(我将'_csrf'添加到标题和正文中)
angular.module('auth', ['openline', 'ngCookies'])
.config(function ($stateProvider) {
//my config
})
.factory('Auth', function ($http, $window, $rootScope, $cookies) {
return {
getAccessTokenLINE: function() {
return $http.post($rootScope.server.url + '/getAccessTokenLINE', {
channelId : $window.sessionStorage.lineChannelId,
channelSecret : $window.sessionStorage.lineChannelSecret,
callbackURL : $window.sessionStorage.callbackURL,
getTokenURL : $window.sessionStorage.lineGetTokenURL,
code : $window.sessionStorage.authorizationCode,
_csrf : $cookies._csrf
},
{
headers: {
_csrf : $cookies._csrf
}
});
}
}
line.js(当我向我的 API (/getAccessTokenLINE) 发送请求时发生 403 Forbidden 错误,所以我认为这个文件并不重要)
var request = require('request');
function getAccessToken(req, res, next) {
var channelId = req.body.channelId;
var channelSecret = req.body.channelSecret;
var callbackURL = req.body.callbackURL;
var getTokenURL = req.body.getTokenURL;
var authorizationCode = req.body.code;
request.post({
uri: getTokenURL,
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
form: {
grant_type : 'authorization_code',
client_id : channelId,
client_secret : channelSecret,
redirect_uri : callbackURL,
code : authorizationCode
}
}, function(error, response, body) {
if (!error && response.statusCode == 200) {
return res.send(body);
} else {
return res.send(response.statusCode, error);
}
});
}
我试图改变
var csrfProtection = csrf({ cookie: true})
到
var csrfProtection = csrf({ cookie: true, ignoreMethods: ['GET', 'POST', 'HEAD', 'OPTIONS']})
然后我可以正常访问我的 API。所以,我认为设置没有错。
我不明白出了什么问题。
编辑:我找到了解决方案。
app.use(cookieParser());
app.use(csrf());
app.use(function(req, res, next) {
res.cookie('XSRF-TOKEN', req.csrfToken());
return next();
});
【问题讨论】:
-
你是在哪里声明
line.getAccessTokenserver.js -
@Burdy 抱歉,我编辑了