2016-12-30 63 views
4

我有一个感性的时候试图测试使用护照的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请求,在测试环境中,如果有一个授权头。由于没有头,一切工作正常。我怀疑这是一些最近的依赖更新做。

+1

发生什么情况,如果在开发环境中使用您使用在您的测试完全相同的JWT令牌?这听起来好像是应用程序崩溃是由于无效令牌 –

+0

@miparnisari增加了一些信息的问题 –

+0

嗯......我想最好的办法是通过线调试的代码行:/抱歉,我不能想什么其他 –

回答

0

创建测试环境了全新的用户和使用后这在单元测试中,一切都按预期工作e用户的授权头中的JWT完美工作。

看来,在某种程度上使用无效智威汤逊正在使用的用户进行身份验证,在测试环境中(从蒙戈DB)。也许是基于用户架构来构建JWT的方式。

我不知道为什么会发生这种情况(早期构建阶段)。现在无法复制。

我的单元测试,执行以下操作:

1)POST来认证端点,以获得JWT令牌(从用户的电子邮件地址和密码)

2)购买私人身份验证只与智威汤逊端点。

在私人GET,passport.authenticate('jwt' ....只是不是在所有的工作,因此,没有任何请求或响应。

我看不到任何其他的原因,这是行不通的以外无效JWT。

我从这里学到的,如果你有失败的单元测试与认证有关,排除从旧/新用户和工作。

+0

它不能被该令牌是过期?我有这个问题一次,但我使用的是硬编码的JWT –

+0

我不这么认为,因为正在使用的jwt是在之前的验证帖子中生成的,该验证帖也设置了7天的失效日期。 –

+0

是的,我认为是这样。很奇怪的问题:/ –