我是Sails.js的新手,我试图制作一个过滤器来授权使用来自更高服务器的Bearer令牌,一个看门人负责从GitHub API进行OAuth2身份验证。服务流很好。我已经知道Passport.js,但我试图自己实现这个。我带了一个policy
看起来像:
module.exports = function (req, res, next) {
var httpsExec = require('https');
if (req.headers.authorization) {
var parts = req.headers.authorization.split(' ');
if (parts.length == 2) {
var tokenType = parts[0]
, credentials = parts[1];
if (/^Bearer$/i.test(tokenType) || /^bearer$/i.test(tokenType)) {
httpsExec.request({
host: 'api.github.com',
post: 443,
path: '/user',
method: 'GET',
headers: {'Authorization': 'token ' + credentials, 'User-Agent': 'curly'}
}, function (response) {
var responseData = '';
response.setEncoding('utf8');
response.on('data', function (chunk) {
responseData += chunk;
});
response.once('error', function (err) {
next(err);
});
response.on('end', function () {
try {
req.options.user = JSON.parse(responseData);
next();
} catch (e) {
res.send(401, {error: e});
}
});
}).end();
} else {
console.err("The token is not a Bearer");
res.send(401)
}
}
} else {
res.send(401, {error: "Full authentication is necessary to access this resource"})
}
};
一旦我点击控制器路线就会调用该策略,但它会抛出_http_outgoing.js:335
throw new Error('Can\'t set headers after they are sent.');
^
Error: Can't set headers after they are sent.
该过程终止。
我认为问题是next()
和returns
我想到的任何地方我想,放next()
调用,但仍然给我这个错误,如果我删除然后我锁定对政策的要求。
修改
我做了一个简单的策略示例,我只是在req.options.values上设置了一些属性并发生了同样的问题,所以可能是req.options.requestData = JSON.parse(responseData);
的问题?我怎样才能设置一个属性发送给控制器?
答案 0 :(得分:1)
response.once('error', function (err) {
next(err);
});
response.on('end', function () {
try {
req.options.user = JSON.parse(responseData);
next();
} catch (e) {
res.send(401, {error: e});
}
});
两者都被执行。错误地检查console.log(“something”)以查看是否有错误。
答案 1 :(得分:1)
当您尝试一起修改请求和响应或修改其中一个请求时,会发生这种情况。
在你的代码中,我认为回调被调用两次,你也在同时修改响应。检查您正在呼叫回拨的行" next()"。你会发现你的问题。