Przeglądaj źródła

fix: unauthorized error

Ahmad Kholid 2 lat temu
rodzic
commit
7b2cec5164
3 zmienionych plików z 34 dodań i 8 usunięć
  1. 1 0
      src/content/services/webService.js
  2. 27 4
      src/stores/main.js
  3. 6 4
      src/utils/api.js

+ 1 - 0
src/content/services/webService.js

@@ -201,6 +201,7 @@ window.addEventListener('user-logout', () => {
 });
 
 window.addEventListener('app-mounted', async () => {
+  console.log('haha');
   try {
     const STORAGE_KEY = 'supabase.auth.token';
     const session = parseJSON(localStorage.getItem(STORAGE_KEY), null);

+ 27 - 4
src/stores/main.js

@@ -2,7 +2,7 @@ import { defineStore } from 'pinia';
 import defu from 'defu';
 import browser from 'webextension-polyfill';
 import deepmerge from 'lodash.merge';
-import { fetchGapi } from '@/utils/api';
+import { fetchGapi, fetchApi } from '@/utils/api';
 
 export const useStore = defineStore('main', {
   storageMap: {
@@ -49,7 +49,7 @@ export const useStore = defineStore('main', {
       this.settings = deepmerge(this.settings, settings);
       await this.saveToStorage('settings');
     },
-    async checkGDriveIntegration(force = false) {
+    async checkGDriveIntegration(force = false, retryCount = 0) {
       try {
         if (this.integrationsRetrieved.googleDrive && !force) return;
 
@@ -58,8 +58,31 @@ export const useStore = defineStore('main', {
         );
         if (!result) return;
 
-        this.integrations.googleDrive =
-          result.scope.includes('auth/drive.file');
+        const isIntegrated = result.scope.includes('auth/drive.file');
+        const { sessionToken } = await browser.storage.local.get(
+          'sessionToken'
+        );
+
+        if (!isIntegrated && sessionToken?.refresh && retryCount < 3) {
+          const response = await fetchApi(
+            `/me/refresh-session?token=${sessionToken.refresh}`,
+            { auth: true }
+          );
+          const refreshResult = await response.json();
+          if (!response.ok) throw new Error(refreshResult.message);
+
+          await browser.storage.local.set({
+            sessionToken: {
+              ...sessionToken,
+              access: refreshResult.token,
+            },
+          });
+          await this.checkGDriveIntegration(force, retryCount + 1);
+
+          return;
+        }
+
+        this.integrations.googleDrive = isIntegrated;
       } catch (error) {
         console.error(error);
       }

+ 6 - 4
src/utils/api.js

@@ -2,7 +2,7 @@ import secrets from 'secrets';
 import browser from 'webextension-polyfill';
 import { parseJSON, isObject } from './helper';
 
-export async function fetchApi(path, options) {
+export async function fetchApi(path, options = {}) {
   const urlPath = path.startsWith('/') ? path : `/${path}`;
   const headers = {
     'Content-Type': 'application/json',
@@ -161,7 +161,8 @@ export function validateOauthToken() {
       );
       if (response.status === 400 && sessionToken.refresh && retryCount <= 3) {
         const refreshResponse = await fetchApi(
-          `/me/refresh-session?token=${sessionToken.refresh}`
+          `/me/refresh-session?token=${sessionToken.refresh}`,
+          { auth: true }
         );
         const refreshResult = await refreshResponse.json();
 
@@ -211,11 +212,12 @@ export async function fetchGapi(url, resource = {}, options = {}) {
       response.status === 403 &&
       result?.error?.message.includes('insufficient authentication scopes');
     if (
-      (response.status === 401 || insufficientScope) &&
+      (!sessionToken.access || response.status === 401 || insufficientScope) &&
       sessionToken.refresh
     ) {
       const refreshResponse = await fetchApi(
-        `/me/refresh-session?token=${sessionToken.refresh}`
+        `/me/refresh-session?token=${sessionToken.refresh}`,
+        { auth: true }
       );
       const refreshResult = await refreshResponse.json();