multitenancy.test.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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("multitenancy", function() {
  7. const tenants = {
  8. a: {
  9. secret: "secret-a"
  10. }
  11. };
  12. let ctx;
  13. beforeEach(() => {
  14. ctx = mockContext();
  15. });
  16. const secretAsync = async function(ctx, payload) {
  17. const issuer = payload.iss;
  18. if (tenants[issuer]) {
  19. return tenants[issuer].secret;
  20. }
  21. throw new UnauthorizedError("missing_secret", {
  22. message: "Could not find secret for issuer."
  23. });
  24. };
  25. const middleware = koajwt({
  26. secret: secretAsync
  27. });
  28. it("should retrieve secret using callback", async () => {
  29. const token = jwt.sign({ iss: "a", foo: "bar" }, tenants.a.secret);
  30. ctx.headers.authorization = "Bearer " + token;
  31. await middleware(ctx, () => {});
  32. assert.equal("bar", ctx.state.user.foo);
  33. });
  34. it("should throw if an error ocurred when retrieving the token", async () => {
  35. const secret = "shhhhhh";
  36. const token = jwt.sign({ iss: "inexistent", foo: "bar" }, secret);
  37. ctx.headers.authorization = "Bearer " + token;
  38. try {
  39. await middleware(ctx, () => {});
  40. } catch (err) {
  41. assert.ok(err);
  42. assert.equal(err.code, "missing_secret");
  43. assert.equal(err.message, "Could not find secret for issuer.");
  44. }
  45. });
  46. it("should fail if token is revoked", async () => {
  47. const token = jwt.sign({ iss: "a", foo: "bar" }, tenants.a.secret);
  48. ctx.headers.authorization = "Bearer " + token;
  49. try {
  50. await koajwt({
  51. secret: secretAsync,
  52. isRevoked: async function(ctx, payload) {
  53. return true;
  54. }
  55. })(ctx, () => {});
  56. } catch (err) {
  57. assert.ok(err);
  58. assert.equal(err.code, "revoked_token");
  59. assert.equal(err.message, "The token has been revoked.");
  60. }
  61. });
  62. });