我有一个感性的时候试图测试使用护照的JWT战略,Authorization头保护途径。在单元测试护照JWT权威性 - 插座挂断
我试过爱可信,supertest,SuperAgent的,我也得到了同样的错误 - “插座挂断”:
Error: socket hang up
at createHangUpError (_http_client.js:253:15)
at Socket.socketOnEnd (_http_client.js:345:23)
at emitNone (events.js:91:20)
at Socket.emit (events.js:185:7)
at endReadableNT (_stream_readable.js:974:12)
at _combinedTickCallback (internal/process/next_tick.js:74:11)
at process._tickDomainCallback (internal/process/next_tick.js:122:9) code: 'ECONNRESET', response: undefined }
这完全适用于开发环境,这只是发生在测试环境 - 单元测试或dev env指向测试数据库/用户。
我知道这个错误意味着连接被服务器或语法错误就崩溃关闭,但有没有语法错误。端点不会让过去的护照身份验证:
passport.authenticate('jwt'...
为什么?这怎么解决?
端点:
router.route('/private')
.get(
passport.authenticate('jwt', { session: false }), (req, res, next) => {
res.json({ allTheThings: true });
})
测试:
describe('GET /api/private',() => {
it('should work',() => {
const USER_JWT_VALID = 'JWT asdf.....';
let instance = axios.create();
instance.defaults.headers.common['Authorization'] = USER_JWT_VALID;
return instance.get('http://localhost:3000/api/private')
.then((response) => {
expect(response.data).to.be.an('object'); // response.data undefined
}).catch((error) => {
console.log('err ', error); //socket hang up
});
});
});
如果我删除passport.authenticate
和只需发送一个JSON响应,它按预期工作。
该日志显示了该请求在授权报头具有正确JWT发送。
RE评论
我有开发和测试不同的DB /用户。在dev中使用测试数据库,我能够复制单元测试中看到的问题。如果我排除授权标题,正如期望的那样,我会得到一个'未授权'响应(来自令牌检查功能)。
当我加入智威汤逊的授权头,我没有得到中得到任何回应:(
进一步调试
看来,我的API不再能够做任何GET请求,在测试环境中,如果有一个授权头。由于没有头,一切工作正常。我怀疑这是一些最近的依赖更新做。
发生什么情况,如果在开发环境中使用您使用在您的测试完全相同的JWT令牌?这听起来好像是应用程序崩溃是由于无效令牌 –
@miparnisari增加了一些信息的问题 –
嗯......我想最好的办法是通过线调试的代码行:/抱歉,我不能想什么其他 –