测试受保护的 api 调用、mocha、supertest、node js、passport

Posted

技术标签:

【中文标题】测试受保护的 api 调用、mocha、supertest、node js、passport【英文标题】:Testing a protected api call, mocha, supertest, node js, passport 【发布时间】:2014-06-17 21:16:11 【问题描述】:

我有一个以护照作为中间件的受保护 api 调用:

  server.get('/api/pipes', auth, api.pipes);

如果用户没有被授权,auth 方法会返回 401。

我有这个测试看看用户是否登录:

  var postValidLoginCredentials = function()
    return request(url).post('/api/login')
      .set('Content-Type', 'multipart/form-data')
      .field('email', 'john.smith@example.com')
      .field('password', 'example')
  ;

//This pass passes
it('should return 200 OK when a user enters a valid user and pass', function(done)
  postValidLoginCredentials()
  .end(function(err, res)
    res.should.have.status('200');
    done();
  );
);

这是我对受保护的 api 调用的测试:

it('should return 200 OK on GET /api/pipes when user is loggedin', function (done) 
      postValidLoginCredentials()
        .end(function(err, res)
          request(url)
            .get('/api/pipes')
            .set('Accept', 'application/json')
            .expect(200, done);
        )
    );

我首先发布我的登录信息。然后在登录回调中调用受保护的 api 调用。应该是 200,但我得到了 401。该功能在我的客户端中有效,所以在我的测试中出现问题。

我也尝试过将我的 postValidLoginCredentials 放在一个函数中,但它不起作用。

有什么想法吗?

【问题讨论】:

您有机会在下面查看我的建议吗? 感谢您的回答。在您发布之前,我找到了解决方案。我在登录时使用了设置的 cookie。然后我在受保护的路径调用中使用“获取”cookie。我使用较低级别的超级代理来执行此操作。所以我不确定你的解决方案是否有效。 我不确定我是否理解您的评论,但您不应该自己设置 cookie,因为护照会为您完成。还是你只是修改了你的测试,我弄错了? 【参考方案1】:

我假设您正在使用“本地”登录策略,并使用 cookie 保持会话。

用户登录后,您需要一种方法来识别发出经过身份验证的请求的登录用户。在 cookie 中使用会话 ID 时,您可以这样做:

it('should return 200 OK on GET /api/pipes when user is loggedin', function (done) 
      postValidLoginCredentials()
        .end(function(err, res)
          request(url)
            .get('/api/pipes')
            .set('Accept', 'application/json')
            .set('Cookie', res.headers['set-cookie'])
            .expect(200, done);
        )
    ); 

但是,这只是一种解决方法,您应该改用 supertest 的代理功能。您可以在README 中了解它(该示例正是关于 cookie 存储的),或者在 supertest repo 中阅读一堆tests using it。

【讨论】:

以上是关于测试受保护的 api 调用、mocha、supertest、node js、passport的主要内容,如果未能解决你的问题,请参考以下文章

从 React 调用受 Azure AD 保护的 API

如何使用 REST + CodeceptJS 测试 API,访问受 Auth0 保护?

Jmeter-如何在Jmeter中测试受客户端证书身份验证保护的api?

调用 Lua API 时出现不受保护的错误(尝试调用空值)

受保护插槽的单元测试[关闭]

壹刊Azure AD调用受Microsoft 标识平台保护的 ASP.NET Core Web API (上)