strapi-identity 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/README.md +5 -2
  2. package/dist/admin/{AdminReset-CqHhVBS_.js → AdminReset-BiWQDTRv.js} +3 -4
  3. package/dist/admin/{AdminReset-B-WGECOX.mjs → AdminReset-DOmsyqwQ.mjs} +1 -2
  4. package/dist/admin/{ProfileToggle-BRYjt5Lu.js → ProfileToggle-BUqs_hxZ.js} +8 -218
  5. package/dist/admin/{ProfileToggle-BCtCsOvj.mjs → ProfileToggle-k0d-caPC.mjs} +2 -210
  6. package/dist/admin/{SettingsPage-DAxGIv_E.js → SettingsPage-DVVkN1xw.js} +3 -6
  7. package/dist/admin/{SettingsPage-7Ytl01jH.mjs → SettingsPage-Dm_llkYv.mjs} +1 -4
  8. package/dist/admin/{ar-DwZqj0qM.mjs → ar-B4yBU4m7.mjs} +7 -0
  9. package/dist/admin/{ar-BYnI7Tsa.js → ar-wjkCnUTi.js} +7 -0
  10. package/dist/admin/{ca-sBRHuaFU.js → ca-BHz1SCoK.js} +7 -0
  11. package/dist/admin/{ca-aKVVc8iQ.mjs → ca-DLE8GCgI.mjs} +7 -0
  12. package/dist/admin/{cs--prflMHS.mjs → cs-3kxvJ5GN.mjs} +7 -0
  13. package/dist/admin/{cs-gU7KP3Lx.js → cs-Echs10hb.js} +7 -0
  14. package/dist/admin/{de-BT25lv_6.mjs → de-BTldhzPN.mjs} +7 -0
  15. package/dist/admin/{de-CrlCAUuf.js → de-p5oK0g4T.js} +7 -0
  16. package/dist/admin/{dk-Ck3AQYU7.mjs → dk-CCNCrmIK.mjs} +7 -0
  17. package/dist/admin/{dk-BNC3WUzY.js → dk-Z6BhrTeh.js} +7 -0
  18. package/dist/admin/{en-9qzlpde0.mjs → en-1anycEwN.mjs} +7 -0
  19. package/dist/admin/{en-DBj0AD5g.js → en-CLnZaoOA.js} +7 -0
  20. package/dist/admin/{es-D5Sn41_H.js → es-C-4sXZ_R.js} +7 -0
  21. package/dist/admin/{es-lh6XoPb7.mjs → es-DMANTUCL.mjs} +7 -0
  22. package/dist/admin/{eu-Cuz6ijBX.mjs → eu-BITeCOIE.mjs} +7 -0
  23. package/dist/admin/{eu-Qr3RvDPW.js → eu-CHWReAeU.js} +7 -0
  24. package/dist/admin/{fr-ChlDcZsG.mjs → fr-C81x3RP3.mjs} +7 -0
  25. package/dist/admin/{fr-C4pmkPYn.js → fr-DH-kRY27.js} +7 -0
  26. package/dist/admin/{gu-BMZL76zM.js → gu-CDocz32V.js} +7 -0
  27. package/dist/admin/{gu-B6zyD1bW.mjs → gu-DDR6O_Dp.mjs} +7 -0
  28. package/dist/admin/{he-H6iBa45A.js → he-CKFM5685.js} +7 -0
  29. package/dist/admin/{he-C5V-qZCX.mjs → he-TPBr5x3o.mjs} +7 -0
  30. package/dist/admin/{hi-Be8rPk7I.js → hi-DqJ11ApQ.js} +7 -0
  31. package/dist/admin/{hi-czhOWo6-.mjs → hi-Pwt1EMiO.mjs} +7 -0
  32. package/dist/admin/{hu-NbZ3aiYV.mjs → hu-CTKkJzwl.mjs} +7 -0
  33. package/dist/admin/{hu-DKp6kOmc.js → hu-DFGcSNo0.js} +7 -0
  34. package/dist/admin/{id-NH9PvcR5.mjs → id-Bq3jNpUL.mjs} +7 -0
  35. package/dist/admin/{id-DO0bwFgY.js → id-ChXHR8aw.js} +7 -0
  36. package/dist/admin/{index-D03zlFnm.js → index-B9P8S4CX.js} +428 -9
  37. package/dist/admin/{index-BfC6z9N5.mjs → index-DpIJdETG.mjs} +439 -20
  38. package/dist/admin/index.js +1 -1
  39. package/dist/admin/index.mjs +1 -1
  40. package/dist/admin/{it-Cmrey6tg.mjs → it-CgRQVAPr.mjs} +7 -0
  41. package/dist/admin/{it-Df6-7-M7.js → it-r0rbu0x0.js} +7 -0
  42. package/dist/admin/{ja-HuAq9ZwT.js → ja-27vNq46V.js} +7 -0
  43. package/dist/admin/{ja-DH3KMqOL.mjs → ja-2xaH1Qf2.mjs} +7 -0
  44. package/dist/admin/{ko-DPN28RE8.mjs → ko-CGgmfI4W.mjs} +7 -0
  45. package/dist/admin/{ko-S9k8KA8K.js → ko-Ci0l5h1b.js} +7 -0
  46. package/dist/admin/{ml-Bh9GGqcW.js → ml-Augll2or.js} +7 -0
  47. package/dist/admin/{ml-MsHNacm6.mjs → ml-aXIja392.mjs} +7 -0
  48. package/dist/admin/{ms-hO5YeEg4.js → ms-B8pBYl9n.js} +7 -0
  49. package/dist/admin/{ms-TjHAaxTd.mjs → ms-CLGR4CKx.mjs} +7 -0
  50. package/dist/admin/{nl-BLILZU8-.mjs → nl-CGFOqn_t.mjs} +7 -0
  51. package/dist/admin/{nl-BF98NBwL.js → nl-Cqn_nYD8.js} +7 -0
  52. package/dist/admin/{no-BtVZ-siy.mjs → no-BIbR3s2A.mjs} +7 -0
  53. package/dist/admin/{no-bl1OXlfa.js → no-DPF_xI-b.js} +7 -0
  54. package/dist/admin/{pl-DCSB6LwZ.mjs → pl-BBEIjPVT.mjs} +7 -0
  55. package/dist/admin/{pl-DCnOWIDw.js → pl-BjIa9TiI.js} +7 -0
  56. package/dist/admin/{pt-BR-D2_UrxTp.js → pt-BR-BbPay13q.js} +7 -0
  57. package/dist/admin/{pt-BR-CeLqmj88.mjs → pt-BR-C0S_4PYn.mjs} +7 -0
  58. package/dist/admin/{pt-DIu8RT_X.js → pt-DDhcHCz6.js} +7 -0
  59. package/dist/admin/{pt-fgjdOyW5.mjs → pt-DwDWDT_T.mjs} +7 -0
  60. package/dist/admin/{ru-BccMCf0l.js → ru-BzQ0SoFG.js} +7 -0
  61. package/dist/admin/{ru-B_hlpAyP.mjs → ru-DuxM9hFK.mjs} +7 -0
  62. package/dist/admin/{sa-D3A-fo85.js → sa-Cwsmxq_x.js} +7 -0
  63. package/dist/admin/{sa-BtuJ_I1t.mjs → sa-DfqNZDgh.mjs} +7 -0
  64. package/dist/admin/{sk-mmuTFlCK.mjs → sk-BcYzeG4F.mjs} +7 -0
  65. package/dist/admin/{sk-uSLC6KhO.js → sk-Coqlt4Kq.js} +7 -0
  66. package/dist/admin/{sv-CuKk5tE-.js → sv-9zwaCIfo.js} +7 -0
  67. package/dist/admin/{sv-BlaHc5ax.mjs → sv-CkoFHi6o.mjs} +7 -0
  68. package/dist/admin/{th-BwyhFaeE.mjs → th-C4FBlfLA.mjs} +7 -0
  69. package/dist/admin/{th-Bv3NKkYO.js → th-CFkjhGd6.js} +7 -0
  70. package/dist/admin/{tr-Bmvs-Hx-.js → tr-D0g7vqL1.js} +7 -0
  71. package/dist/admin/{tr-BLocNlbZ.mjs → tr-Djsa55Fh.mjs} +7 -0
  72. package/dist/admin/{uk-CyZ10xtq.mjs → uk-BDoDjhO2.mjs} +7 -0
  73. package/dist/admin/{uk-BDxn-EZU.js → uk-Dw1MGmom.js} +7 -0
  74. package/dist/admin/{vi-Bx_UJ8up.mjs → vi-D977KjlZ.mjs} +7 -0
  75. package/dist/admin/{vi-F_mqQCme.js → vi-DNZKFaOu.js} +7 -0
  76. package/dist/admin/{zh-CFZJPG5N.js → zh-C2aozMiZ.js} +7 -0
  77. package/dist/admin/{zh-CjJdRa3l.mjs → zh-CKYKCaVd.mjs} +7 -0
  78. package/dist/admin/{zh-Hans-s7G2GUHU.mjs → zh-Hans-DNgRcEC-.mjs} +7 -0
  79. package/dist/admin/{zh-Hans-4BhSwSQw.js → zh-Hans-ellQkyo7.js} +7 -0
  80. package/dist/server/index.js +88 -16
  81. package/dist/server/index.mjs +88 -16
  82. package/package.json +3 -3
  83. package/dist/admin/tokenHelpers-DagDzpso.mjs +0 -22
  84. package/dist/admin/tokenHelpers-jtoRu0q5.js +0 -21
@@ -71,11 +71,11 @@ const defaultConfig$1 = {
71
71
  </table>
72
72
  </div>`
73
73
  };
74
- const bootstrap = async () => {
75
- const config2 = strapi.documents("plugin::strapi-identity.strapi-identity-config");
74
+ const bootstrap = async ({ strapi: strapi2 }) => {
75
+ const config2 = strapi2.documents("plugin::strapi-identity.strapi-identity-config");
76
76
  const existingConfig = await config2.count({});
77
77
  if (!existingConfig) await config2.create({ data: defaultConfig$1 });
78
- strapi.admin.services.permission.actionProvider.registerMany([
78
+ strapi2.admin.services.permission.actionProvider.registerMany([
79
79
  {
80
80
  uid: "settings.read",
81
81
  section: "plugins",
@@ -9620,25 +9620,13 @@ var jsonwebtokenExports = requireJsonwebtoken();
9620
9620
  const jwt = /* @__PURE__ */ getDefaultExportFromCjs(jsonwebtokenExports);
9621
9621
  const register = ({ strapi: strapi2 }) => {
9622
9622
  const { admin: admin2, config: config2, server } = strapi2;
9623
+ registerMiddlewares(server);
9623
9624
  const secret2 = config2.get("admin.auth.secret");
9624
9625
  const domain = config2.get("admin.auth.domain");
9625
9626
  const loginRoute = admin2.routes.admin.routes.find(
9626
9627
  ({ method, path }) => method === "POST" && path === "/login"
9627
9628
  );
9628
9629
  if (loginRoute) replaceLogin(loginRoute, secret2, domain);
9629
- server.use(async (ctx, next) => {
9630
- const mfaCookie = ctx.cookies.get("strapi_admin_mfa");
9631
- if (mfaCookie && ctx.path.startsWith("/admin/auth")) {
9632
- ctx.cookies.set("jwtToken", null, { expires: /* @__PURE__ */ new Date(0) });
9633
- ctx.redirect("/admin/strapi-identity/verify");
9634
- return;
9635
- }
9636
- if (!mfaCookie && ctx.path === "/admin/strapi-identity/verify") {
9637
- ctx.redirect("/admin");
9638
- return;
9639
- }
9640
- await next();
9641
- });
9642
9630
  };
9643
9631
  const replaceLogin = (route2, secret2, domain) => {
9644
9632
  route2.config.middlewares = route2.config.middlewares || [];
@@ -9680,6 +9668,68 @@ const replaceLogin = (route2, secret2, domain) => {
9680
9668
  ctx.body.data = { data: {}, error: null };
9681
9669
  });
9682
9670
  };
9671
+ const registerMiddlewares = (server) => {
9672
+ const configService = strapi.service("plugin::strapi-identity.config");
9673
+ server.use(async (ctx, next) => {
9674
+ const mfaCookie = ctx.cookies.get("strapi_admin_mfa");
9675
+ if (mfaCookie && ctx.path.startsWith("/admin/auth")) {
9676
+ ctx.cookies.set("jwtToken", null, { expires: /* @__PURE__ */ new Date(0) });
9677
+ ctx.redirect("/admin/strapi-identity/verify");
9678
+ return;
9679
+ }
9680
+ if (!mfaCookie && ctx.path === "/admin/strapi-identity/verify") {
9681
+ ctx.redirect("/admin");
9682
+ return;
9683
+ }
9684
+ await next();
9685
+ });
9686
+ server.use(async (ctx, next) => {
9687
+ const cookie = ctx.cookies.get("jwtToken");
9688
+ if (!cookie) {
9689
+ await next();
9690
+ return;
9691
+ }
9692
+ const config2 = await configService.getConfig();
9693
+ if (!config2.enabled || !config2.enforce) {
9694
+ await next();
9695
+ return;
9696
+ }
9697
+ const userEnabled = await configService.checkUserByJWT(cookie);
9698
+ if (userEnabled) {
9699
+ if (ctx.path === "/admin/strapi-identity/enforced") {
9700
+ ctx.redirect("/admin");
9701
+ return;
9702
+ }
9703
+ await next();
9704
+ return;
9705
+ }
9706
+ const allowedPaths = [
9707
+ "/admin/strapi-identity/enforced",
9708
+ "/admin/init",
9709
+ "/admin/users/me",
9710
+ "/strapi-identity/status",
9711
+ "/strapi-identity/config",
9712
+ "/strapi-identity/config/enabled",
9713
+ "/strapi-identity/enable",
9714
+ "/strapi-identity/setup",
9715
+ "/strapi-identity/enable-email",
9716
+ "/strapi-identity/setup-email"
9717
+ ];
9718
+ const isAllowed = allowedPaths.includes(ctx.path) || // Static assets (JS, CSS, images, fonts, sourcemaps)
9719
+ /\.(mjs|js|css|png|jpg|jpeg|gif|svg|ico|woff2?|ttf|eot|map)(\?.*)?$/.test(ctx.path) || ctx.path.startsWith("/admin/@");
9720
+ if (!isAllowed) console.log(ctx.path);
9721
+ if (!isAllowed) {
9722
+ if (ctx.accepts("html") && ctx.path.startsWith("/admin")) {
9723
+ ctx.redirect("/admin/strapi-identity/enforced");
9724
+ return;
9725
+ }
9726
+ ctx.status = 403;
9727
+ ctx.body = { error: { status: 403, message: "MFA setup required." } };
9728
+ return;
9729
+ }
9730
+ await next();
9731
+ });
9732
+ };
9683
9733
  const config$4 = {
9684
9734
  default: {},
9685
9735
  validator() {
@@ -10455,8 +10505,30 @@ const disableMFAForAllUsers = async () => {
10455
10505
  console.log("Error disabling MFA for all users:", err);
10456
10506
  }
10457
10507
  };
10508
+ const checkUserByJWT = async (jwtToken) => {
10509
+ const config2 = await getConfig();
10510
+ const secret2 = strapi.config.get("admin.auth.secret");
10511
+ if (!config2.enabled) return false;
10512
+ let userId;
10513
+ try {
10514
+ const decoded = jwt.verify(jwtToken, secret2);
10515
+ userId = decoded.userId || decoded.id;
10516
+ } catch {
10517
+ return false;
10518
+ }
10519
+ if (!userId) return false;
10520
+ try {
10521
+ const mfaExists = await strapi.documents("plugin::strapi-identity.mfa-token").count({
10522
+ filters: { admin_user: { id: userId }, enabled: true }
10523
+ });
10524
+ return mfaExists > 0;
10525
+ } catch {
10526
+ return false;
10527
+ }
10528
+ };
10458
10529
  const config = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10459
10530
  __proto__: null,
10531
+ checkUserByJWT,
10460
10532
  getConfig,
10461
10533
  isEnabled,
10462
10534
  updateConfig
@@ -64,11 +64,11 @@ const defaultConfig$1 = {
64
64
  </table>
65
65
  </div>`
66
66
  };
67
- const bootstrap = async () => {
68
- const config2 = strapi.documents("plugin::strapi-identity.strapi-identity-config");
67
+ const bootstrap = async ({ strapi: strapi2 }) => {
68
+ const config2 = strapi2.documents("plugin::strapi-identity.strapi-identity-config");
69
69
  const existingConfig = await config2.count({});
70
70
  if (!existingConfig) await config2.create({ data: defaultConfig$1 });
71
- strapi.admin.services.permission.actionProvider.registerMany([
71
+ strapi2.admin.services.permission.actionProvider.registerMany([
72
72
  {
73
73
  uid: "settings.read",
74
74
  section: "plugins",
@@ -9613,25 +9613,13 @@ var jsonwebtokenExports = requireJsonwebtoken();
9613
9613
  const jwt = /* @__PURE__ */ getDefaultExportFromCjs(jsonwebtokenExports);
9614
9614
  const register = ({ strapi: strapi2 }) => {
9615
9615
  const { admin: admin2, config: config2, server } = strapi2;
9616
+ registerMiddlewares(server);
9616
9617
  const secret2 = config2.get("admin.auth.secret");
9617
9618
  const domain = config2.get("admin.auth.domain");
9618
9619
  const loginRoute = admin2.routes.admin.routes.find(
9619
9620
  ({ method, path }) => method === "POST" && path === "/login"
9620
9621
  );
9621
9622
  if (loginRoute) replaceLogin(loginRoute, secret2, domain);
9622
- server.use(async (ctx, next) => {
9623
- const mfaCookie = ctx.cookies.get("strapi_admin_mfa");
9624
- if (mfaCookie && ctx.path.startsWith("/admin/auth")) {
9625
- ctx.cookies.set("jwtToken", null, { expires: /* @__PURE__ */ new Date(0) });
9626
- ctx.redirect("/admin/strapi-identity/verify");
9627
- return;
9628
- }
9629
- if (!mfaCookie && ctx.path === "/admin/strapi-identity/verify") {
9630
- ctx.redirect("/admin");
9631
- return;
9632
- }
9633
- await next();
9634
- });
9635
9623
  };
9636
9624
  const replaceLogin = (route2, secret2, domain) => {
9637
9625
  route2.config.middlewares = route2.config.middlewares || [];
@@ -9673,6 +9661,68 @@ const replaceLogin = (route2, secret2, domain) => {
9673
9661
  ctx.body.data = { data: {}, error: null };
9674
9662
  });
9675
9663
  };
9664
+ const registerMiddlewares = (server) => {
9665
+ const configService = strapi.service("plugin::strapi-identity.config");
9666
+ server.use(async (ctx, next) => {
9667
+ const mfaCookie = ctx.cookies.get("strapi_admin_mfa");
9668
+ if (mfaCookie && ctx.path.startsWith("/admin/auth")) {
9669
+ ctx.cookies.set("jwtToken", null, { expires: /* @__PURE__ */ new Date(0) });
9670
+ ctx.redirect("/admin/strapi-identity/verify");
9671
+ return;
9672
+ }
9673
+ if (!mfaCookie && ctx.path === "/admin/strapi-identity/verify") {
9674
+ ctx.redirect("/admin");
9675
+ return;
9676
+ }
9677
+ await next();
9678
+ });
9679
+ server.use(async (ctx, next) => {
9680
+ const cookie = ctx.cookies.get("jwtToken");
9681
+ if (!cookie) {
9682
+ await next();
9683
+ return;
9684
+ }
9685
+ const config2 = await configService.getConfig();
9686
+ if (!config2.enabled || !config2.enforce) {
9687
+ await next();
9688
+ return;
9689
+ }
9690
+ const userEnabled = await configService.checkUserByJWT(cookie);
9691
+ if (userEnabled) {
9692
+ if (ctx.path === "/admin/strapi-identity/enforced") {
9693
+ ctx.redirect("/admin");
9694
+ return;
9695
+ }
9696
+ await next();
9697
+ return;
9698
+ }
9699
+ const allowedPaths = [
9700
+ "/admin/strapi-identity/enforced",
9701
+ "/admin/init",
9702
+ "/admin/users/me",
9703
+ "/strapi-identity/status",
9704
+ "/strapi-identity/config",
9705
+ "/strapi-identity/config/enabled",
9706
+ "/strapi-identity/enable",
9707
+ "/strapi-identity/setup",
9708
+ "/strapi-identity/enable-email",
9709
+ "/strapi-identity/setup-email"
9710
+ ];
9711
+ const isAllowed = allowedPaths.includes(ctx.path) || // Static assets (JS, CSS, images, fonts, sourcemaps)
9712
+ /\.(mjs|js|css|png|jpg|jpeg|gif|svg|ico|woff2?|ttf|eot|map)(\?.*)?$/.test(ctx.path) || ctx.path.startsWith("/admin/@");
9713
+ if (!isAllowed) console.log(ctx.path);
9714
+ if (!isAllowed) {
9715
+ if (ctx.accepts("html") && ctx.path.startsWith("/admin")) {
9716
+ ctx.redirect("/admin/strapi-identity/enforced");
9717
+ return;
9718
+ }
9719
+ ctx.status = 403;
9720
+ ctx.body = { error: { status: 403, message: "MFA setup required." } };
9721
+ return;
9722
+ }
9723
+ await next();
9724
+ });
9725
+ };
9676
9726
  const config$4 = {
9677
9727
  default: {},
9678
9728
  validator() {
@@ -10448,8 +10498,30 @@ const disableMFAForAllUsers = async () => {
10448
10498
  console.log("Error disabling MFA for all users:", err);
10449
10499
  }
10450
10500
  };
10501
+ const checkUserByJWT = async (jwtToken) => {
10502
+ const config2 = await getConfig();
10503
+ const secret2 = strapi.config.get("admin.auth.secret");
10504
+ if (!config2.enabled) return false;
10505
+ let userId;
10506
+ try {
10507
+ const decoded = jwt.verify(jwtToken, secret2);
10508
+ userId = decoded.userId || decoded.id;
10509
+ } catch {
10510
+ return false;
10511
+ }
10512
+ if (!userId) return false;
10513
+ try {
10514
+ const mfaExists = await strapi.documents("plugin::strapi-identity.mfa-token").count({
10515
+ filters: { admin_user: { id: userId }, enabled: true }
10516
+ });
10517
+ return mfaExists > 0;
10518
+ } catch {
10519
+ return false;
10520
+ }
10521
+ };
10451
10522
  const config = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10452
10523
  __proto__: null,
10524
+ checkUserByJWT,
10453
10525
  getConfig,
10454
10526
  isEnabled,
10455
10527
  updateConfig
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.2.0",
2
+ "version": "0.4.0",
3
3
  "keywords": [
4
4
  "strapi",
5
5
  "plugin",
@@ -40,11 +40,11 @@
40
40
  "input-otp": "^1.4.2",
41
41
  "otpauth": "^9.5.0",
42
42
  "qrcode.react": "^4.2.0",
43
- "strapi-admin-portal": "^0.2.2"
43
+ "strapi-admin-portal": "^0.3.0"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@strapi/sdk-plugin": "^6.0.1",
47
- "@strapi/typescript-utils": "^5.39.0",
47
+ "@strapi/typescript-utils": "^5.40.0",
48
48
  "@types/bcryptjs": "^2.4.6",
49
49
  "@types/react": "^18.3.27",
50
50
  "@types/react-dom": "^18.3.7",
@@ -1,22 +0,0 @@
1
- const getCookieValue = (name) => {
2
- let result = null;
3
- const cookieArray = document.cookie.split(";");
4
- cookieArray.forEach((cookie) => {
5
- const [key, value] = cookie.split("=").map((item) => item.trim());
6
- if (key === name) {
7
- result = decodeURIComponent(value);
8
- }
9
- });
10
- return result;
11
- };
12
- const getToken = () => {
13
- const fromLocalStorage = localStorage.getItem("jwtToken");
14
- if (fromLocalStorage) {
15
- return JSON.parse(fromLocalStorage);
16
- }
17
- const fromCookie = getCookieValue("jwtToken");
18
- return fromCookie ?? null;
19
- };
20
- export {
21
- getToken as g
22
- };
@@ -1,21 +0,0 @@
1
- "use strict";
2
- const getCookieValue = (name) => {
3
- let result = null;
4
- const cookieArray = document.cookie.split(";");
5
- cookieArray.forEach((cookie) => {
6
- const [key, value] = cookie.split("=").map((item) => item.trim());
7
- if (key === name) {
8
- result = decodeURIComponent(value);
9
- }
10
- });
11
- return result;
12
- };
13
- const getToken = () => {
14
- const fromLocalStorage = localStorage.getItem("jwtToken");
15
- if (fromLocalStorage) {
16
- return JSON.parse(fromLocalStorage);
17
- }
18
- const fromCookie = getCookieValue("jwtToken");
19
- return fromCookie ?? null;
20
- };
21
- exports.getToken = getToken;