You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署后MongoDB Realm所有用户自动登出问题求助

解决MongoDB Realm部署后用户令牌过期问题

关于Realm会话临时文件的必要性

MongoDB Realm Node.js SDK默认会在应用目录下生成会话存储文件,用来保存用户的刷新令牌和会话状态,目的是自动为用户刷新过期的访问令牌,维持登录状态。这类文件是SDK默认实现的一部分,但并非必需——你可以通过自定义存储逻辑替代它,避免依赖应用部署目录的本地文件。

解决方案

1. 自定义会话存储路径

将会话文件转移到部署时不会被覆盖/删除的持久化目录(比如服务器的独立数据目录,而非应用的部署目录)。初始化Realm应用时指定localAppDataPath参数:

const { Realm } = require('realm');

// 替换为你的持久化目录路径
const persistentStoragePath = '/var/realm-sessions';

const app = new Realm.App({
  id: '你的Realm应用ID',
  localAppDataPath: persistentStoragePath
});

确保这个目录在部署过程中不会被清空,且应用进程有读写权限。

2. 客户端手动管理JWT令牌

完全摆脱服务端的会话存储,让客户端负责保存和维护令牌:

  • 用户登录时,从Realm获取accessToken和refreshToken,返回给客户端
  • 客户端将令牌存入本地安全存储(如localStorage、移动端Keychain等)
  • 每次API请求,客户端在请求头携带Authorization: Bearer <accessToken>
  • 当服务端检测到访问令牌过期时,客户端调用Realm的令牌刷新接口,用refreshToken换取新的accessToken
  • 服务端仅需验证令牌签名和有效性,无需存储任何会话数据

3. 用分布式缓存替代本地文件存储

如果需要服务端维护会话,可将会话数据存入Redis这类分布式缓存,替换默认的文件存储。自定义AppSessionStorage实现:

const { Realm, AppSessionStorage } = require('realm');
const redis = require('redis');

class RedisSessionStore extends AppSessionStorage {
  constructor() {
    super();
    this.client = redis.createClient({ /* Redis配置 */ });
    this.client.connect();
  }

  async get(key) {
    const sessionData = await this.client.get(`realm:session:${key}`);
    return sessionData ? JSON.parse(sessionData) : null;
  }

  async set(key, value) {
    // 设置会话过期时间,与Realm默认会话有效期一致(比如7天)
    await this.client.setEx(`realm:session:${key}`, 86400 * 7, JSON.stringify(value));
  }

  async remove(key) {
    await this.client.del(`realm:session:${key}`);
  }
}

// 初始化Realm应用时传入自定义存储
const app = new Realm.App({
  id: '你的Realm应用ID',
  sessionStorage: new RedisSessionStore()
});

这种方式适合多实例部署的场景,会话数据可以在多个服务实例间共享。

内容的提问来源于stack exchange,提问作者VishnuKumar ps

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 01:50:37