测试使用 jwt 令牌保护的路由的正确方法是什么?

What is the proper way to test routes secured with jwt token?

虽然下面的测试通过了,但我觉得我做错了。每次需要测试安全路由时,我是否都需要登录?我尝试在获得初始令牌后传递全局变量,但我发现传递变量非常反直觉。在 before() 调用中传递变量给我带来了与在嵌套承诺中传递/访问全局变量相同的问题。

describe('Users', function(done) {
  var testToken = 'my-test-token'
  it('logs in', function(done) { // <= Pass in done callback
    var rT = 'tttttt'
    chai.request(urlroot)
      .post('/login')
      .type('form')
      .send({ email: 'test_user_1@this.com', password: '9999' })
      .end(function(err, res) {
        expect(res).to.have.status(200);
        expect(res.body.token).to.be.a('string');
        done()
      });
  });

  it('gets all users', function(done) { // <= Pass in done callback
    // console.log(urlroot + '/users');
    chai.request(urlroot)
      .post('/login')
      .type('form')
      .send({ email: 'test_user_1@this.com', password: '9999' })
      .end(function(err, res) {
        chai.request(urlapi)
          .get('/users?secret_token='+res.body.token)
          .end(function(err, res){
            console.log('data', res.body);
            // expect(res.body).to.be.json()
          })
      });
  });
});

我所做的是使用 before() 方法调用我的身份验证服务,以与应用程序相同的方式获取令牌,并将其存储到变量中。

类似于:

var token = "";
before(async () => {
    //Get token
    token = "Bearer " + await getToken();
});

然后,在您想要使用凭据的每个测试中使用 .set()

it('...', function (done) {
    chai
      .request(url)
      .set("Authorization", token) //Call .set() before .get()
      .get("/users")
      //...
})