cb 4 месяцев назад
Родитель
Сommit
c1425fcc91
2 измененных файлов с 52 добавлено и 0 удалено
  1. 3 0
      angular.json
  2. 49 0
      src/app/app.ts

+ 3 - 0
angular.json

@@ -111,5 +111,8 @@
         }
       }
     }
+  },
+  "cli": {
+    "analytics": false
   }
 }

+ 49 - 0
src/app/app.ts

@@ -109,6 +109,14 @@ export class App implements OnInit {
     this.userId = params.get('user') || params.get('userid') || '';
     this.apigId = params.get('apigid') || 'Vo3ROWEvDy';
     this.funId = params.get('fun_id') || DEFAULT_FUN_ID;
+    const urlToken = params.get('token') || '';
+
+    // 0. URL 携带 token → 使用 Parse become 登录
+    if (urlToken) {
+      console.log('[AUTH] URL 携带 token,使用 become 登录...');
+      this.becomeWithToken(urlToken);
+      return;
+    }
 
     // 1. URL 已提供足够参数 → 直接加载
     if (this.authId || (this.userId && this.apigId)) {
@@ -136,6 +144,47 @@ export class App implements OnInit {
     this.needLogin = true;
   }
 
+  /**
+   * 通过 URL 中的 token 调用 Parse Server 的 become(fetch /parse/users/me)完成登录
+   */
+  async becomeWithToken(token: string): Promise<void> {
+    try {
+      const resp = await fetch(`${API_BASE}/parse/users/me?include=company`, {
+        headers: {
+          'X-Parse-Application-Id': APP_ID,
+          'X-Parse-Session-Token': token
+        }
+      });
+      const data = await resp.json();
+      if (!data.objectId) {
+        console.warn('[AUTH] become 失败,token 无效:', data);
+        this.errorMsg = 'Token 无效或已过期,请重新登录。';
+        this.needLogin = true;
+        this.cdr.detectChanges();
+        return;
+      }
+      // become 成功 — 写入状态
+      this.userId = data.objectId;
+      this.sessionToken = token;
+      this.loggedInUser = data.nickname || data.username || data.mobilePhoneNumber || data.objectId;
+      this.companyId = data.company?.objectId || '';
+      console.log('[AUTH] become 成功, user:', data.objectId, data.username || '', 'company:', this.companyId || '(无)');
+
+      // 持久化到 localStorage
+      localStorage.setItem('apig_user_id', this.userId);
+      localStorage.setItem('apig_session_token', token);
+      localStorage.setItem('apig_display_name', this.loggedInUser);
+
+      this.cdr.detectChanges();
+      this.loadApig();
+    } catch (e: any) {
+      console.error('[AUTH] become 请求异常:', e);
+      this.errorMsg = 'Token 登录失败: ' + e.message;
+      this.needLogin = true;
+      this.cdr.detectChanges();
+    }
+  }
+
   async validateAndLoad(token: string, userId: string): Promise<void> {
     try {
       const resp = await fetch(`${API_BASE}/parse/users/me?include=company`, {