gpt4 book ai didi

javascript - 单元测试中的 Passport JWT 身份验证 - 套接字挂断

转载 作者:搜寻专家 更新时间:2023-10-31 23:26:33 25 4
gpt4 key购买 nike

我正在尝试测试使用 passport 的 JWT 策略和授权 header 的 protected 路由。

我已经尝试过 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 }

这在开发环境中完美运行,这只发生在测试环境中——单元测试或指向测试数据库/用户的开发环境。

我知道这个错误意味着连接因服务器崩溃或语法错误而关闭,但没有语法错误。端点未通过 Passport 身份验证:

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 发送的。

回复评论

我有不同的数据库/用户用于开发和测试。在开发中使用测试数据库,我能够复制单元测试中看到的问题。如果我排除授权 header ,我会按预期收到“未授权”响应(来自 token 检查功能)。

一旦我使用 JWT 添加授权 header ,我就根本没有收到任何响应:(

进一步调试

在测试环境中,如果有授权 header ,我的 api 似乎不再能够执行任何 GET 请求。没有标题,一切正常。我怀疑这与最近的一些依赖项更新有关。

最佳答案

在为测试环境创建一个全新的用户并在单元测试中使用它之后,一切都按预期进行。在授权 header 中使用用户 JWT 的 GET 请求可以完美地工作。

似乎在测试环境(来自 mongo 数据库)中用于身份验证的用户以某种方式使用了无效的 JWT。可能与基于用户模式构建 JWT 的方式有关。

我不知道这是为什么或如何发生的(早期构建阶段)。现在无法复制。

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

1) POST 到身份验证端点以获取 JWT token (来自用户电子邮件和密码)

2) GET private auth only endpoint with that JWT.

在私有(private) GET 上,passport.authenticate('jwt' .... 根本不起作用,因此没有请求或响应。​​

除了无效的 JWT 之外,我看不出有任何其他原因导致它不起作用。

我从中了解到,如果涉及身份验证的单元测试失败,请排除旧/新用户并从中解决。

关于javascript - 单元测试中的 Passport JWT 身份验证 - 套接字挂断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41398404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com