revocation.test.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. const jwt = require("jsonwebtoken");
  2. const assert = require("assert");
  3. const koajwt = require("../lib");
  4. const UnauthorizedError = require("../lib/errors/UnauthorizedError");
  5. const mockContext = require("./context");
  6. describe("revoked jwts", function() {
  7. const secret = "shhhhhh";
  8. const revoked_id = "1234";
  9. let ctx;
  10. beforeEach(() => {
  11. ctx = mockContext();
  12. });
  13. const middleware = koajwt({
  14. secret: secret,
  15. isRevoked: async function(ctx, payload) {
  16. return payload.jti && payload.jti === revoked_id;
  17. }
  18. });
  19. it("should throw if token is revoked", async () => {
  20. const token = jwt.sign({ jti: revoked_id, foo: "bar" }, secret);
  21. ctx.headers.authorization = "Bearer " + token;
  22. try {
  23. await middleware(ctx, () => {});
  24. } catch (err) {
  25. assert.ok(err);
  26. assert.equal(err.code, "revoked_token");
  27. assert.equal(err.message, "The token has been revoked.");
  28. }
  29. });
  30. it("should work if token is not revoked", async () => {
  31. const token = jwt.sign({ jti: "1233", foo: "bar" }, secret);
  32. ctx.headers.authorization = "Bearer " + token;
  33. await middleware(ctx, () => {});
  34. assert.equal("bar", ctx.state.user.foo);
  35. });
  36. it("should throw if error occurs checking if token is revoked", async () => {
  37. const token = jwt.sign({ jti: revoked_id, foo: "bar" }, secret);
  38. ctx.headers.authorization = "Bearer " + token;
  39. try {
  40. await koajwt({
  41. secret,
  42. isRevoked: async (ctx, payload) => {
  43. throw new Error("An error ocurred");
  44. }
  45. })(ctx, () => {});
  46. } catch (err) {
  47. assert.ok(err);
  48. assert.equal(err.message, "An error ocurred");
  49. }
  50. });
  51. });