Sfoglia il codice sorgente

更新feishu用户session创建错误问题

warrior 2 giorni fa
parent
commit
5517887c07

+ 3 - 3
api/routes.ts

@@ -92,11 +92,11 @@ router.use(
 let createFeishuRouter;
 try {
   ({ createFeishuRouter } = await globalThis.loadModule(
-    'https://repos.fmode.cn/x/fmode-feishu-api/0.0.1/fmode-feishu-api.min.js?code=xxxxxxx'
+    'https://repos.fmode.cn/x/fmode-feishu-api/0.0.2/fmode-feishu-api.min.js?code=xxxxxxx'
   ));
 } catch (e) {
-  console.warn("[API Routes] CDN 加载失败, 使用本地模块回退", e);
-  ({ createFeishuRouter } = await import('../modules/fmode-feishu-api/src/router.ts'));
+  // console.warn("[API Routes] CDN 加载失败, 使用本地模块回退", e);
+  // ({ createFeishuRouter } = await import('../modules/fmode-feishu-api/src/router.ts'));
 }
 
 router.use(

+ 1 - 1
modules/fmode-feishu-api/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@fmode/feishu-api",
-  "version": "0.0.1",
+  "version": "0.0.2",
   "description": "飞书 API 集成模块 - 提供飞书OAuth2登录、网页免登录等功能",
   "type": "module",
   "main": "src/index.ts",

+ 54 - 31
modules/fmode-feishu-api/src/user-manager.ts

@@ -350,62 +350,85 @@ export class FeishuUserManager {
         throw new Error('Parse不可用');
       }
 
-      // 查询用户现有的有效 sessionToken
+      // 查询用户现有的有效 sessionToken(剩余有效期大于2小时)
+      const twoHoursLater = new Date();
+      twoHoursLater.setHours(twoHoursLater.getHours() + 2);
+
       const query = new Parse.Query('_Session');
       query.equalTo('user', {
         __type: 'Pointer',
         className: '_User',
         objectId: user.id
       });
-      query.greaterThan('expiresAt', new Date());
+      query.greaterThan('expiresAt', twoHoursLater);
       query.descending('expiresAt');
 
       const existingSession = await query.first({ useMasterKey: true });
 
-      // 如果存在有效的 session,检查剩余有效期
+      // 如果找到剩余有效期大于2小时的 session,直接复用
       if (existingSession) {
-        const expiresAt = existingSession.get('expiresAt');
-        const now = new Date();
-        const remainingTime = expiresAt.getTime() - now.getTime();
-        const twoHoursInMs = 2 * 60 * 60 * 1000; // 2小时的毫秒数
-
-        // 如果剩余有效期大于等于2小时,复用现有的 sessionToken
-        if (remainingTime >= twoHoursInMs) {
-          console.log(`复用现有SessionToken for user: ${user.id}, 剩余有效期: ${(remainingTime / 1000 / 60 / 60).toFixed(2)}小时`);
-          return existingSession;
-        }
+        console.log(`复用现有SessionToken for user: ${user.id}`);
+        return existingSession;
       }
 
       // 创建新的 sessionToken
-      const SessionClass = Parse.Object.extend('_Session');
-      const session = new SessionClass();
-
       const salt = user.id + '_' + (new Date().getTime() / 1000).toFixed();
       const md5 = crypto.createHash('md5').update(salt, 'utf8').digest('hex');
       const sessionToken = "r:" + md5;
 
       console.log(`生成新SessionToken: ${sessionToken} for user: ${user.id}`);
 
-      session.set("user", {
-        __type: 'Pointer',
-        className: '_User',
-        objectId: user.id
-      });
-      session.set("sessionToken", sessionToken);
-
       const expiresAt = new Date();
       expiresAt.setFullYear(expiresAt.getFullYear() + 1);
-      session.set("expiresAt", expiresAt);
 
-      session.set("createdWith", {
-        "action": "login",
-        "authProvider": "feishu"
+      // 使用 REST API 创建 Session,绕过 SDK 的只读属性限制
+      const serverURL = Parse.serverURL || (globalThis as any).appConfig.serverURL;
+      const appId = Parse.applicationId || (globalThis as any)?.appConfig.appId;
+      const masterKey = Parse.masterKey || (globalThis as any)?.appConfig.masterKey;
+
+      const response = await fetch(`${serverURL}/classes/_Session`, {
+        method: 'POST',
+        headers: {
+          'X-Parse-Application-Id': appId,
+          'X-Parse-Master-Key': masterKey,
+          'Content-Type': 'application/json'
+        },
+        body: JSON.stringify({
+          user: {
+            __type: 'Pointer',
+            className: '_User',
+            objectId: user.id
+          },
+          sessionToken: sessionToken,
+          expiresAt: {
+            __type: 'Date',
+            iso: expiresAt.toISOString()
+          },
+          createdWith: {
+            action: "login",
+            authProvider: "feishu"
+          },
+          restricted: false
+        })
       });
-      session.set("restricted", false);
-      session.className = "_Session";
-      const savedSession = await session.save(null, { useMasterKey: true });
+
+      if (!response.ok) {
+        const errorText = await response.text();
+        throw new Error(`Session创建失败: ${response.status} ${errorText}`);
+      }
+
+      const data = await response.json();
+      if (!data || !data.objectId) {
+        throw new Error('Session创建失败:未返回objectId');
+      }
+
+      // 查询并返回创建的 Session 对象
+      const sessionQuery = new Parse.Query('_Session');
+      sessionQuery.equalTo('objectId', data.objectId);
+      const savedSession = await sessionQuery.first({ useMasterKey: true });
+
       if (!savedSession) {
-        throw new Error('Session创建失败');
+        throw new Error('Session查询失败');
       }
 
       return savedSession;