DashboardGuard.svelte 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. <script>
  2. import { onMount, onDestroy } from 'svelte';
  3. import { goto } from '$app/navigation';
  4. import { browser } from '$app/environment';
  5. import { writable } from 'svelte/store';
  6. const authorized = writable(true);
  7. //TODO: When will has a token validation we need to validate the token here
  8. //tenho que verificar se realmente vai ser feito essa validacao a cada minuto
  9. const apiUrl = import.meta.env.VITE_API_URL;
  10. let intervalId = null;
  11. async function validate() {
  12. if (!browser) return;
  13. const m1 = document.cookie.match(/(?:^|; )auth_token=([^;]+)/);
  14. const token = m1 ? decodeURIComponent(m1[1]) : null;
  15. if (!token) {
  16. authorized.set(false);
  17. goto('/');
  18. return;
  19. }
  20. try {
  21. const res = await fetch(`${apiUrl}/verify/jwt`, {
  22. method: 'POST',
  23. headers: {
  24. 'content-type': 'application/json',
  25. 'Authorization': `Bearer ${token}`
  26. },
  27. body: JSON.stringify({ token })
  28. });
  29. const raw = await res.text();
  30. let body = null;
  31. if (raw) {
  32. try {
  33. body = JSON.parse(raw);
  34. } catch (err) {
  35. console.error('verify/jwt JSON parse error:', err);
  36. }
  37. }
  38. const isActive = body?.status === 'ok' && body?.data?.status === 'active';
  39. if (!res.ok || !isActive) throw new Error('inactive-token');
  40. authorized.set(true);
  41. } catch (e) {
  42. authorized.set(false);
  43. goto('/');
  44. }
  45. }
  46. onMount(() => {
  47. validate();
  48. intervalId = setInterval(validate, 600000);
  49. });
  50. onDestroy(() => {
  51. if (intervalId) clearInterval(intervalId);
  52. });
  53. </script>
  54. {#if $authorized}
  55. <slot />
  56. {/if}