同一域名下Ember.js多应用如何实现已登录应用免密共享会话令牌
实现同域名下Ember.js多应用共享登录状态
问题核心是你给每个应用的session存储设置了独立标识——cookieName和localStorageKey分别用了appA、appB、appC,导致三个应用读写不同的存储位置,没法共享登录状态。要实现/appB登录后/appC自动免密登录,按以下步骤调整:
1. 统一session存储的键名
把三个应用的app/session-stores/application.js里的cookieName和localStorageKey改成同一个值,比如shared-app-session,让所有应用读写同一个存储位置的认证令牌:
// 路径:app/session-stores/application.js import AdaptiveStore from 'ember-simple-auth/session-stores/adaptive'; export default class ApplicationSessionStore extends AdaptiveStore { cookieName = 'shared-app-session'; localStorageKey = 'shared-app-session'; }
2. 确保应用自动恢复会话
ember-simple-auth的AdaptiveStore默认会在应用启动时自动尝试从存储中恢复会话,修改完键名后,用户打开/appC时,应用会自动读取共享的cookie或localStorage里的令牌,无需手动输入账号密码就能恢复登录状态。
如果你的应用路由有自定义beforeModel逻辑,可以额外加一行确保会话恢复:
// 在应用的根路由或应用路由中 beforeModel(transition) { return this.session.restore().then(() => { super.beforeModel(transition); }); }
3. 清理旧存储(可选)
如果之前用户已在各应用登录过,可能残留了appA、appB、appC的旧cookie和localStorage项,可在应用启动时清除这些旧数据避免干扰:
// 在ApplicationRoute的init或beforeModel中 init() { super.init(...arguments); // 清除旧的localStorage项 ['appA', 'appB', 'appC'].forEach(key => localStorage.removeItem(key)); // 清除旧的cookie ['appA', 'appB', 'appC'].forEach(key => document.cookie = `${key}=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT`); }
调整完成后,用户在任一应用登录,其他同域名下的应用都会自动读取共享的认证令牌,实现免登录跳转。
内容的提问来源于stack exchange,提问作者Torprendido
相关产品推荐
相关产品推荐

