单元测试中的 Passport JWT 身份验证 - 套接字挂断
Passport JWT auth in unit test - socket hang up
我正在尝试测试使用 passport 的 JWT 策略的受保护路由,并授权 header。
我已经尝试过 axios、supertest、superagent,但我得到了同样的错误 - 'socket hang up':
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 }
这在开发环境中完美运行,这只发生在测试环境中 - 单元测试或指向测试的开发环境 DB/users。
我知道这个错误意味着连接因服务器崩溃或语法错误而关闭,但没有语法错误。端点未通过护照身份验证:
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 响应,它会按预期工作。
日志显示请求是在授权 header 中使用正确的 JWT 发送的。
回复评论
我有一个不同的 DB/users 用于开发和测试。在开发中使用测试数据库,我能够复制单元测试中看到的问题。如果我排除授权 header,我会按预期收到 'Unauthorized' 响应(来自令牌检查功能)。
一旦我使用 JWT 添加授权 header,我就完全没有收到任何响应:(
进一步调试
似乎我的api在测试环境中不再能够执行任何GET请求,如果有授权header。没有 header,一切正常。我怀疑这与最近的一些依赖项更新有关。
为测试环境创建一个全新的用户并在单元测试中使用它后,一切都按预期进行。 GET 请求在授权中使用用户的 JWT header 工作完美。
似乎在测试环境(来自 mongo 数据库)中用于身份验证的用户以某种方式使用了无效的 JWT。可能与基于用户模式构建 JWT 的方式有关。
我不知道这是为什么或如何发生的(早期构建阶段)。现在无法复制。
我的单元测试进行了以下操作:
1) POST 到身份验证端点以获取 JWT 令牌(来自用户电子邮件和密码)
2) 使用该 JWT 获取仅限私有身份验证的端点。
在私有 GET 上,passport.authenticate('jwt' ....
根本没有工作,因此没有请求或响应。
除了无效的 JWT 之外,我看不出有任何其他原因导致它不起作用。
我从中了解到,如果涉及身份验证的单元测试失败,请排除 old/new 个用户并从中解决。
我正在尝试测试使用 passport 的 JWT 策略的受保护路由,并授权 header。
我已经尝试过 axios、supertest、superagent,但我得到了同样的错误 - 'socket hang up':
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 }
这在开发环境中完美运行,这只发生在测试环境中 - 单元测试或指向测试的开发环境 DB/users。
我知道这个错误意味着连接因服务器崩溃或语法错误而关闭,但没有语法错误。端点未通过护照身份验证:
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 响应,它会按预期工作。
日志显示请求是在授权 header 中使用正确的 JWT 发送的。
回复评论
我有一个不同的 DB/users 用于开发和测试。在开发中使用测试数据库,我能够复制单元测试中看到的问题。如果我排除授权 header,我会按预期收到 'Unauthorized' 响应(来自令牌检查功能)。
一旦我使用 JWT 添加授权 header,我就完全没有收到任何响应:(
进一步调试
似乎我的api在测试环境中不再能够执行任何GET请求,如果有授权header。没有 header,一切正常。我怀疑这与最近的一些依赖项更新有关。
为测试环境创建一个全新的用户并在单元测试中使用它后,一切都按预期进行。 GET 请求在授权中使用用户的 JWT header 工作完美。
似乎在测试环境(来自 mongo 数据库)中用于身份验证的用户以某种方式使用了无效的 JWT。可能与基于用户模式构建 JWT 的方式有关。
我不知道这是为什么或如何发生的(早期构建阶段)。现在无法复制。
我的单元测试进行了以下操作:
1) POST 到身份验证端点以获取 JWT 令牌(来自用户电子邮件和密码)
2) 使用该 JWT 获取仅限私有身份验证的端点。
在私有 GET 上,passport.authenticate('jwt' ....
根本没有工作,因此没有请求或响应。
除了无效的 JWT 之外,我看不出有任何其他原因导致它不起作用。
我从中了解到,如果涉及身份验证的单元测试失败,请排除 old/new 个用户并从中解决。