|
@@ -350,62 +350,85 @@ export class FeishuUserManager {
|
|
|
throw new Error('Parse不可用');
|
|
throw new Error('Parse不可用');
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 查询用户现有的有效 sessionToken
|
|
|
|
|
|
|
+ // 查询用户现有的有效 sessionToken(剩余有效期大于2小时)
|
|
|
|
|
+ const twoHoursLater = new Date();
|
|
|
|
|
+ twoHoursLater.setHours(twoHoursLater.getHours() + 2);
|
|
|
|
|
+
|
|
|
const query = new Parse.Query('_Session');
|
|
const query = new Parse.Query('_Session');
|
|
|
query.equalTo('user', {
|
|
query.equalTo('user', {
|
|
|
__type: 'Pointer',
|
|
__type: 'Pointer',
|
|
|
className: '_User',
|
|
className: '_User',
|
|
|
objectId: user.id
|
|
objectId: user.id
|
|
|
});
|
|
});
|
|
|
- query.greaterThan('expiresAt', new Date());
|
|
|
|
|
|
|
+ query.greaterThan('expiresAt', twoHoursLater);
|
|
|
query.descending('expiresAt');
|
|
query.descending('expiresAt');
|
|
|
|
|
|
|
|
const existingSession = await query.first({ useMasterKey: true });
|
|
const existingSession = await query.first({ useMasterKey: true });
|
|
|
|
|
|
|
|
- // 如果存在有效的 session,检查剩余有效期
|
|
|
|
|
|
|
+ // 如果找到剩余有效期大于2小时的 session,直接复用
|
|
|
if (existingSession) {
|
|
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
|
|
// 创建新的 sessionToken
|
|
|
- const SessionClass = Parse.Object.extend('_Session');
|
|
|
|
|
- const session = new SessionClass();
|
|
|
|
|
-
|
|
|
|
|
const salt = user.id + '_' + (new Date().getTime() / 1000).toFixed();
|
|
const salt = user.id + '_' + (new Date().getTime() / 1000).toFixed();
|
|
|
const md5 = crypto.createHash('md5').update(salt, 'utf8').digest('hex');
|
|
const md5 = crypto.createHash('md5').update(salt, 'utf8').digest('hex');
|
|
|
const sessionToken = "r:" + md5;
|
|
const sessionToken = "r:" + md5;
|
|
|
|
|
|
|
|
console.log(`生成新SessionToken: ${sessionToken} for user: ${user.id}`);
|
|
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();
|
|
const expiresAt = new Date();
|
|
|
expiresAt.setFullYear(expiresAt.getFullYear() + 1);
|
|
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) {
|
|
if (!savedSession) {
|
|
|
- throw new Error('Session创建失败');
|
|
|
|
|
|
|
+ throw new Error('Session查询失败');
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return savedSession;
|
|
return savedSession;
|