簡體   English   中英

使用 Mocha 和 Chai 測試 JWT 身份驗證

[英]Testing JWT Authentication Using Mocha and Chai

我一直在為我的get端點編寫測試,這需要admin的令牌才能返回用戶列表。

這是我的用戶端點:

   app.get("/users", (req,res) => {
      const payload = req.payload

      if (payload && payload.user === "admin") {
         User.find({}, (err, users) => {
            if(!err) {
               res.status(200).send(users)
            } else { res.status(500).send(err) }
         })
      } else { res.status(500).send("Authentication Error!)}
   }

這是我的 jwt 中間件:

   module.exports = {
  validateToken: (req, res, next) => {
    const authorizationHeader = req.headers.authorization;
    let result;
    if (authorizationHeader) {
      const token = req.headers.authorization.split(" ")[1]; // Bearer <token>
      const options = {
        expiresIn: "2d",
        issuer: "clint maruti"
      };
      try {
        // verify makes sure that the token hasn't expired and has been issued by us
        result = jwt.verify(token, process.env.JWT_SECRET, options);
        // Let's pass back the decoded token to the request object
        req.decoded = result;
        // We call next to pass execution to the subsequent middleware
        next();
      } catch (err) {
          // Throw an error just in case anything goes wrong with verification
          throw new Error(err)
      }
    } else {
        result = {
            error: 'Authentication error. Token required.',
            status: 401
        }
        res.status(401).send(result)
    }
  }
};

這是我的示例測試:

let User = require("../models/users");

// Require dev dependencies
let chai = require("chai");
let chaiHttp = require("chai-http");
let app = require("../app");
let should = chai.should();

chai.use(chaiHttp);

let defaultUser = {
  name: "admin",
  password: "admin@123"
};

let token;

// parent block
describe("User", () => {
  beforeEach(done => {
    chai
      .request(app)
      .post("/users")
      .send(defaultUser)
      .end((err, res) => {
        res.should.have.status(200);
        done();
      });
  });
  beforeEach(done => {
    chai
      .request(app)
      .post("/login")
      .send(defaultUser)
      .end((err, res) => {
        token = res.body.token;
        res.should.have.status(200);
        done();
      });
  });
  afterEach(done => {
    // After each test we truncate the database
    User.remove({}, err => {
      done();
    });
  });

  describe("/get users", () => {
    it("should fetch all users successfully", done => {
      chai
        .request(app)
        .set("Authentication", token)
        .get("/users")
        .end((err, res) => {
          res.should.have.status(200);
          res.body.should.be.a("object");
          res.body.should.have.property("users");
          done();
        });
    });
  });
});

問題:我的測試給了我一個斷言錯誤 500 而不是狀態碼的 200,我在beforeEach函數之前寫了 2 beforeEach 一個,注冊管理員,另一個登錄管理員並獲取令牌。 我想知道這是否是導致錯誤的原因? 請幫忙

我在這里找到了答案:

如何在 Mocha 測試用例中發送標題('授權','不記名令牌')

你必須設置{ Authorization: "Bearer" + token }而不是"Authentication", token

你必須在.get之后調用.set

 describe("/get users", () => {
    it("should fetch all users successfully", (done) => {
      chai
        .request(app)
        .get("/users")
        .set({ Authorization: `Bearer ${token}` })
        .end((err, res) => {
          res.should.have.status(200);
          res.body.should.be.a("object");
          res.body.should.have.property("users");
          done();
        });
    });
  });

chai-http 具有發送授權承載令牌的auth功能。

根據 Github 上的chai-http代碼,可以使用以下方式傳遞令牌:

.auth(accessToken, { type: 'bearer' })

在類似問題上提供的示例: https : //stackoverflow.com/a/66106588/4067905

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM