# UCenterUtils-JS **Repository Path**: eignil/UCenterUtils-JS ## Basic Information - **Project Name**: UCenterUtils-JS - **Description**: UCenter开发工具集合。为方便Java等语言的项目直接对接UCenter,特基于JavaScript开发了对接过程中可能会使用到的小工具,并提供了JavaScript版的代码范例。 - **Primary Language**: JavaScript - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2023-05-15 - **Last Updated**: 2023-05-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # UCenter应用开发工具集 ## 项目简介 本项目为`对接康盛开发的UCenter系统`工作提供必要的文档说明、代码示例以及相关的辅助工具。考虑到*JavaScript作为很多互联网行业软件工程师的必备语言有着较为广泛的使用者,使用JavaScript作为中间语言进行技术的交流门槛较低*;同时*JS项目可以方便的运行在浏览器中,需要查看demo或使用辅助工具时无需搭建额外的开发环境,查看和调试源码示例也较为方便*。因此,本项目采用`JavaScript`作为主要的开发语言,项目涉及到的具体技术:`ES6`、`vue.js`、`bootstrap`、`webpack`、`npm`等。 ## 功能清单 本项目用于辅助对接康盛UCenter系统的开发。项目提供了以下功能: 1. 加/解密工具的校验界面。在浏览器中打开`dist/index.html`即可查看。 2. JS版的加解密算法描述,参照文件`src/ucUtils.js`中的`UcEncoder`类。 3. Api接口的校验和解析逻辑,参照文件`src/api/api.js`。 4. JS版的Client类实现,包括注册、登录、登出等操作,参照`src/client`。 ## 业务场景描述 `自有系统`指的是需要和`UCenter`服务端进行通信从而实现和Discuz系统保持数据同步的系统,在`UCenter`后台中又被称为`应用`。 自有系统和UCenter的通信分为两块: ### UCenter --> 自有系统 在UCenter后台设置应用后,UCenter会根据设置的`应用`参数向`应用`的`接口`(如:`api/uc.php`)发送请求,`应用`收到请求后做出正确的响应(输出`1`),UCenter侧应用列表中对应的`应用`会展示`通信成功`的字样。 在`UCenter`服务端需要`应用`同步更新相关数据时,`UCenter`也会根据设置的`应用`参数向`应用`的`接口`(如:`api/uc.php`)发送请求,`应用`收到请求后执行操作并做出响应即可。 比如:用户在`Discuz`中更新头像和昵称后,`UCenter`就需要通过`自有系统`提供的接口向`自有系统`发送更新指令。 上一节《功能清单》中的第3点提到的文件描述了`接口`的处理逻辑,我们暂时只处理`UCenter`发出的`test`指令,以保证`UCenter`端和`自有系统`可以成功建立通信。 ### 自有系统 --> UCenter `自有系统`侧希望`更改论坛用户的头像`、`自动登录`、`自动登出`、`将用户同步到论坛`时,`自有系统`需要主动调用`UCenter`服务端的接口(如:`uc_server/index.php`)。 **以登录为例:** 1. `自有系统`的`客户端`触发`登录bbs`的事件; 2. `自有系统`的`服务端`拼接参数并将请求发送给`UCenter`; 3. `UCenter`收到登录请求后会进行`验证和其他处理`; 4. 如果登录成功`UCenter`会返回登录令牌参数; 5. `自有系统`解析令牌参数并构造可以同步登录bbs系统的`url`; 6. `自有系统`的`服务端`对`自有系统`的`客户端`做出响应(一般是重定向到上一步构造出的url); 7. `客户端`打开`步骤5`构造的bbs页面即可实现论坛的同步登录。 ## 数据的处理 无论是UCenter访问自有系统的API,还是自有系统向UCenter发送指令,http请求中的数据都要先进行`加/解密`的处理。加/解密的逻辑可以参照文件`src/ucUtils.js`中的`UcEncoder`类,该类的使用可以参照文件`src/api/api.js`和`src/main.js`。 ### 加解密逻辑的调试的说明 在开发其他语言的加解密功能时,可以仿照文件`src/ucUtils.js`中的`UcEncoder`类。对于结果的验证可以在浏览器中打开`dist/index.html`中的html文件,里面提供的`UC加密/解密调试工具`可以方便的完成验证任务。 如果需要比照`加解密算法`各中间变量的值,建议借助chrome的JavaScript调试工具完成: 1. 使用Chrome打开`UC加密/解密调试工具`界面; 2. 打开控制台,在`Sources`选项卡的`top`->`webpack://`下找到`src/ucUtils.js`文件并在关键位置设置断点; 3. 点击界面中的“开始解密”/“开始加密”按钮; 4. 在控制台右侧的`Scope`中即可观察变量值,并和自己的版本进行比照,以便快速定位问题。 ## 关于自动注册、自动登录以及退出账号的流程概述 注册、登录、退出的接口参考`src/client`下面的文件;封装的各个接口的用法可以参考`src/main.js`中的相关代码。 ### 自动登录流程 0. 用户端向`自有系统`请求访问bbs; 1. `自用系统`侧服务器端通过查询本地数据库检查当前用户有没有在UCenter中注册账号; 1.1. 未注册账号,先自动注册账号,参考[自动注册流程](#autoRegister); 1.2. 已注册账号则获取当前用户在UCenter的用户ID。 2. 调用`userSynLogin`的逻辑获取`同步登录的链接`; 3. http响应头中输出302重定向到`同步登录的链接`; 4. 如果在[步骤2]()中获取到的链接后面加上参数`jumpTo`,步骤4之后,客户端页面会自动跳转到`jumpTo`之后的地址;否则步骤4中的页面会一直显示空白。 ### 自动注册流程 自动注册流程可以在[自动登录流程]()中触发。 0. `自有系统`侧检测到当前用户没有在UCenter中注册账户; 1. **准备用户名**:(以下流程仅供参考); 1.1. 客户端提示用户“第一次登录请输入论坛昵称”,向用户提供表单输入`论坛昵称`; 1.2. 服务端调用`checkUsername`的逻辑检查用户输入的昵称是否可用; 1. 用户昵称不可用,提示用户更换昵称; 2. 用户昵称可用,允许用户提交表单。 1.3. 客户端用户提交表单。 2. **准备邮箱**:服务端获取用户的邮箱,调用`checkEmail`的逻辑检查邮箱是否可用; 2.1. 如果用户邮箱不可用或用户没有设置邮箱,为用户随机设置一个虚拟的邮箱(如:1512312312@my.app.local),并重复步骤[2]检查邮箱可用性。 3. **准备密码**:获取`自有系统`侧存储的用户密码特征码,从中取出前10位作为要注册的账户密码(该密码除了用于本注册流程外,其他地方几乎不会到); 4. 调用`userRegister`的逻辑在UCenter中注册一个账户,该接口将返回用户的ID; 5. 注册成功后,将新注册的用户ID绑定到`自有系统`中的用户账户中; 6. 如果本流程处于自动登录流程中,直接回到[自动登录流程](#autoLogin)的[1.2](#getUid)。 ### 自动退出流程 1. 调用`userSynLogin`的逻辑获取`同步退出的链接`; 2. http响应头中输出302重定向到`同步退出的链接`; 3. 如果在[步骤1]()中获取到的链接后面加上参数`jumpTo`,同步退出之后,客户端页面会自动跳转到`jumpTo`之后的地址;否则同步退出后页面会一直显示空白。