title: WPS 私有化登录流程 date: 2026-08-27 tags:
- WPS
- 私有化
- 登录
- Token status: active
WPS 私有化登录流程
1. 登录机制速览
私有化WPS默认使用服务端配置的固定用户静默登录,终端用户不输入账号密码。
| 问题 | 结论 |
|---|---|
| 怎么登录 | 加载项启动时执行autoLogin:缓存没有userInfo时,用getOpenUser返回的固定用户名和密码调用login换取access_token。用户名和密码不写入缓存,只保存在当前JavaScript调用栈;Token和用户信息会落盘 |
| Token存哪里 | <Application.Env.GetTempPath()>/aippt-plugin/aippt-cache.json,字段为Login_loginToken和Login_userInfo |
| 怎么共享 | 通过window.Application.FileSystem读写,TaskPane和WebDialog读取同一份状态 |
| 已知问题 | autoLogin只检查userInfo不检查Token;autoLogin没有被await,首次请求可能早于Token写入;没有Token刷新。见 9. 当前问题 |
| 最常见故障 | Ribbon一直显示未登录(Login_loginToken没有写入)、首次打开页面401(autoLogin和render竞态)。完整表见 10. 排查 |
| 部署安全要求 | HTTPS、固定用户最小权限等见 WPS私有化构建与部署 > 11. 安全项 |
2. 初始化顺序
loadRibbon
→ autoLogin
→ ribbonUI.Invalidate
→ 300ms后自动打开工具箱
→ render入口:
packages/aippt-plugin-wps-com/src/index.js3. 登录时序
sequenceDiagram participant Addin as WPS加载项 participant Cache as WPS FileSystem participant API as 私有化API participant Ribbon as ribbonUI participant Page as 业务页面 Addin->>Cache: 读取Login_userInfo alt 已有userInfo Cache-->>Addin: 直接返回 else 没有userInfo Addin->>API: POST /plugin/user/getOpenUser API-->>Addin: username和password Addin->>API: POST /plugin/user/login API-->>Addin: access_token和userinfo Addin->>Cache: 保存Login_loginToken和Login_userInfo Addin->>Ribbon: Invalidate end Page->>Cache: 读取Login_loginToken Page->>API: Authorization Bearer Token
4. 接口
POST /plugin/user/getOpenUser
POST /plugin/user/login代码:
packages/aippt-plugin-wps-com/src/http/User.tsgetOpenUser返回固定用户名和密码。login返回access_token和userinfo。
用户名和密码不写入缓存,只保存在当前JavaScript调用栈中。Token和用户信息会落盘。
5. 缓存
代码:
packages/aippt-plugin-wps-com/src/utils/UserUtils.js文件:
<Application.Env.GetTempPath()>/aippt-plugin/aippt-cache.json字段:
{
"Login_loginToken": "access_token",
"Login_userInfo": {
"nick_name": "用户名称",
"image_url": "头像URL"
}
}使用window.Application.FileSystem读写。TaskPane和WebDialog可以读取同一份状态。
6. 业务页面读取Token
HttpUtil
→ StorageAdaptor.Token.get
→ Global.getSettings(Login, loginToken)
→ Global/impl/wps.ts
→ WPS FileSystem.ReadFile
→ Authorization: Bearer <token>代码:
packages/aippt-plugin-webview/src/adaptors/StorageAdaptor.ts
packages/aippt-plugin-webview/src/utils/HttpUtil.ts
packages/aippt-plugin-webview/src/common/client-communication/Global/impl/wps.ts7. Ribbon登录状态
Ribbon通过Login_loginToken判断登录状态:
| 状态 | Ribbon行为 |
|---|---|
| 有Token | 隐藏登录按钮,显示账号菜单 |
| 无Token | 显示登录按钮,隐藏账号菜单 |
账号名称和头像来自Login_userInfo。
登录或退出后调用:
window.Application.ribbonUI.Invalidate()WPS重新执行GetVisible、GetLabel和GetImage。
8. 退出和401
退出登录:
删除Login_loginToken
→ 删除Login_userInfo
→ 写回缓存文件
→ Invalidate Ribbon业务请求收到以下401时会清空状态:
NotLoggedIn
AccountBanned
RemoteLogin当前401处理沿用普通客户端登录页逻辑,没有立即重新执行固定用户autoLogin。
9. 当前问题
userInfo和Token判断不一致
autoLogin只检查userInfo,Ribbon检查Token。可能出现:
userInfo存在
Token缺失或过期
→ autoLogin跳过
→ Ribbon显示未登录
→ 业务请求无有效Token登录判断应同时检查userInfo和Token。
页面没有等待登录完成
当前autoLogin()没有被await,页面随后立即渲染。首次请求可能早于Token写入。
更稳妥的顺序:
await autoLogin
→ render
→ autoOpenToolbox没有Token刷新
当前只保存Access Token,没有Refresh Token、过期时间和启动校验。过期后依赖401清理。
固定密码进入客户端运行时
固定密码虽然不落盘,但会由getOpenUser返回到加载项。部署安全要求(HTTPS、固定用户最小权限等)见 WPS私有化构建与部署 > 11. 安全项。
10. 排查
| 现象 | 检查 |
|---|---|
| Ribbon一直显示未登录 | Login_loginToken是否写入 |
| userInfo有但请求401 | Token是否过期或为空 |
| 首次打开页面401 | autoLogin和render竞态 |
| 退出后又自动登录 | 是否重载了WPS加载项 |
| 多个窗口状态不同 | 是否读取同一个GetTempPath缓存文件 |
| API没有Bearer头 | StorageAdaptor和Global/impl/wps.ts |
11. 代码位置
packages/aippt-plugin-wps-com/src/index.js
packages/aippt-plugin-wps-com/src/store/global.js
packages/aippt-plugin-wps-com/src/http/User.ts
packages/aippt-plugin-wps-com/src/utils/UserUtils.js
packages/aippt-plugin-wps-com/src/ribbon/index.js
packages/aippt-plugin-webview/src/adaptors/StorageAdaptor.ts
packages/aippt-plugin-webview/src/utils/HttpUtil.ts相关文档: