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_loginTokenLogin_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.js

3. 登录时序

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.ts

getOpenUser返回固定用户名和密码。login返回access_tokenuserinfo

用户名和密码不写入缓存,只保存在当前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.ts

7. Ribbon登录状态

Ribbon通过Login_loginToken判断登录状态:

状态Ribbon行为
有Token隐藏登录按钮,显示账号菜单
无Token显示登录按钮,隐藏账号菜单

账号名称和头像来自Login_userInfo

登录或退出后调用:

window.Application.ribbonUI.Invalidate()

WPS重新执行GetVisibleGetLabelGetImage

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有但请求401Token是否过期或为空
首次打开页面401autoLogin和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

相关文档: