How to authenticate Supertest requests with Passport?

后端 未结 8 1383
囚心锁ツ
囚心锁ツ 2020-11-28 21:22

I\'m using Passport.js for authentication (local strategy) and testing with Mocha and Supertest.

How can I create a session and make authenticated requests with Supe

相关标签:
8条回答
  • 2020-11-28 22:17

    As an addendum to Andy's answer, in order to have Supertest startup your server for you, you can do it like this:

    var request = require('supertest');
    
    /**
     * `../server` should point to your main server bootstrap file,
     * which has your express app exported. For example:
     * 
     * var app = express();
     * module.exports = app;
     */
    var server = require('../server');
    
    // Using request.agent() is the key
    var agent = request.agent(server);
    
    describe('Sessions', function() {
    
      it('Should create a session', function(done) {
        agent.post('/api/session')
        .send({ username: 'user', password: 'pass' })
        .end(function(err, res) {
          expect(req.status).to.equal(201);
          done();
        });
      });
    
      it('Should return the current session', function(done) {
        agent.get('/api/session').end(function(err, res) {
          expect(req.status).to.equal(200);
          done();
        });
      });
    });
    
    0 讨论(0)
  • 2020-11-28 22:20

    As zeMirco points out, the underlying superagent module supports sessions, automatically maintaining cookies for you. However, it is possible to use the superagent.agent() functionality from supertest, through an undocumented feature.

    Simply use require('supertest').agent('url') instead of require('supertest')('url'):

    var request = require('supertest');
    var server = request.agent('http://localhost:3000');
    
    describe('GET /api/getDir', function(){
        it('login', loginUser());
        it('uri that requires user to be logged in', function(done){
        server
            .get('/api/getDir')                       
            .expect(200)
            .end(function(err, res){
                if (err) return done(err);
                console.log(res.body);
                done()
            });
        });
    });
    
    
    function loginUser() {
        return function(done) {
            server
                .post('/login')
                .send({ username: 'admin', password: 'admin' })
                .expect(302)
                .expect('Location', '/')
                .end(onResponse);
    
            function onResponse(err, res) {
               if (err) return done(err);
               return done();
            }
        };
    };
    
    0 讨论(0)
提交回复
热议问题