为什么我在testing中得到401回应?

我正在尝试在Node / Express / Mongoose后端testing一个具有身份validation的路由。

这是testing文件

var should = require('should'); var _ = require('lodash'); var async = require('async'); var app = require('../../../../app'); var request = require('supertest'); var mongoose = require('mongoose'); var User = mongoose.model('User'); var Firm = mongoose.model('Firm'); var firm, user, userPassword, createdFirm, loggedInUser; describe('GET /api/firms', function(){ beforeEach(function (done) { firm = new Firm({ company: 'My test company', corporateMail: 'test.com' }); userPassword = 'password'; user = new User({ fistname: 'Fake User', lastname: 'Fake User', email: 'test@test.com', job: 'Partner', firmName:firm.company, password:userPassword, isActivated:true, _firmId:firm._id }); function createFirm(cb){ request(app) .post('/api/firms') .send(firm) .expect(201) .end(function(err, res){ if ( err ) throw err; createdFirm = res.body; cb(); }); } function createUser(cb){ request(app) .post('/api/common/users') .send(user) .expect(200) .end(function(err, res){ createdUser = res.body; if ( err ) throw err; cb(); }); }; async.series([function(cb){ createFirm(cb); }, function(cb){ createUser(cb); }], done); }); afterEach(function (done) { firm.remove(); user.remove(); done(); }); it('should respond with 401 error', function(done) { request(app) .get('/api/firms') .expect(401) .end(function(err, res) { if (err) return done(err); done(); }); }); it('should login', function(done) { request(app) .post('/auth/local') .send({email:user.email, password:user.password}) .expect(200) .end(function(err, res) { if (err) return done(err); done(); }); }); it('should respond with 200 after login', function(done) { request(app) .get('/api/firms') .expect(200) .end(function(err, res) { if (err) return done(err); done(); }); }); 

});

在工作stream程中,首先创buildfirm对象,然后返回它的ID,以便我可以用firmId作为参考创build用户。

我想在用户通过validation之后testing/ api / firm路由,但是尽pipe我有各种各样的尝试(使用superagent,loginbefore部分),但我总是在最后一节中得到401响应,而不是预期的200。

其实要记住的重要一点就是,正如KJ3所说,authentication是如何build立起来的。 在我的情况下,我忘了提及我正在使用jwt。 它的工作方式如下:提供用户名和密码,服务器返回使用jwt创build的令牌。

因此,在testing中为每个请求发回令牌是有意义的。

实现这一目的的方法首先是将authentication之后的令牌存储在前一节中

  function createUser(cb){ request(app) .post('/api/users') .send(user) .expect(200) .end(function(err, res){ if ( err ) throw err; authToken = res.body.token; cb(); }); }; 

然后通过在请求中添加.set以正确的格式(在承认服务中定义的“承载”+令牌)的令牌:

  it('should respond with 200', function(done) { var authToken = 'Bearer ' + createdUser.token; request(app) .get('/api/firms') .set('Authorization', authToken) .expect(200) .end(function(err, res) { if (err) return done(err); done(); }); }); 

在这种情况下,testing发回200,如果.set(…)被注释掉,则发送200。

好消息是,这是用supertest实现的,所以不需要添加任何东西,less些好消息是你需要添加.set(…)到每个testing请求。

如果你要在浏览器中进行最后2次testing,取决于你是如何设置的,是的,这要归功于cookie和session,但是这里的/ api / firmtesting独立于auth / localtesting。 所以401是正确的回应。

这实际上取决于你的身份validation是如何设置的,但是你也需要在/ api / firmtesting中进行身份validation。 通过再次发送凭证(每次我的摩卡testing中的每一个都会进行身份validation)或将会话实施到testing中,请参阅此 SOpost了解某些方向。