useAuth.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import api from "src/api";
  2. import { permissionStore } from "src/stores/permission";
  3. import { userStore } from "src/stores/user";
  4. import { useAuthStorage } from "src/composables/useAuthStorage";
  5. let refreshPromise = null;
  6. export const useAuth = () => {
  7. const { setRefreshToken, getRefreshToken, clearRefreshToken } = useAuthStorage();
  8. const clearAuthData = async () => {
  9. userStore().resetUser();
  10. permissionStore().resetScopes();
  11. await clearRefreshToken();
  12. };
  13. const setAuthDataFromPayload = async (tokens) => {
  14. const { access_token, refresh_token, user } = tokens;
  15. userStore().user = user;
  16. userStore().accessToken = access_token;
  17. await setRefreshToken(refresh_token);
  18. await permissionStore().fetchScopes();
  19. };
  20. const login = async (email, password) => {
  21. try {
  22. const response = await api.post("/login", {
  23. email: email,
  24. password: password,
  25. });
  26. if (response.status === 200) {
  27. await setAuthDataFromPayload(response.data.payload);
  28. }
  29. return response;
  30. } catch (error) {
  31. return Promise.reject(error);
  32. }
  33. };
  34. const logout = async () => {
  35. try {
  36. const response = await api.post("/logout");
  37. if (response.status === 200) {
  38. await clearAuthData();
  39. }
  40. } catch (error) {
  41. console.error(error);
  42. await clearAuthData();
  43. }
  44. };
  45. const doRefresh = async () => {
  46. try {
  47. const refreshToken = await getRefreshToken();
  48. if (!refreshToken) {
  49. return Promise.reject(new Error("No refresh token available"));
  50. }
  51. const response = await api.post("/refresh-app", {
  52. refresh_token: refreshToken,
  53. });
  54. if (response.status === 200) {
  55. await setAuthDataFromPayload(response.data.payload);
  56. }
  57. return response;
  58. } catch (error) {
  59. await clearAuthData();
  60. return Promise.reject(error);
  61. }
  62. };
  63. const refresh = () => {
  64. if (!refreshPromise) {
  65. refreshPromise = doRefresh().finally(() => {
  66. refreshPromise = null;
  67. });
  68. }
  69. return refreshPromise;
  70. };
  71. return {
  72. setAuthDataFromPayload,
  73. clearAuthData,
  74. login,
  75. logout,
  76. refresh,
  77. };
  78. };