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

标签 javascript node.js unit-testing passport.js jwt

我正在尝试测试使用 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/

相关文章:

javascript - 如何超时运行 node.js?

c++ - 单元测试++入门

unit-testing - 使用已经测试过的方法的单元测试方法

javascript - 有没有办法使用哈希/校验和来确保已发布的 npm 包的完整性?

json - typescript :导入导入json文件的js库

unit-testing - 如何在某个文件夹下运行测试?

javascript - Rails 应用程序找不到我的 Gem 的 javascript

javascript - 从 facebook/react-native/Examples 运行示例时为 "Error watching file for changes: EMFILE"

javascript - Bootstrap 日期选择器禁用没有当前日期的过去日期

javascript - 按每个对象属性对 javascript 数组进行排序