后端前端协同办公即时通讯企业应用【免费下载链接】dootaskDooTask是一款开源在线项目任务管理工具提供各类文档协作工具、在线思维导图、在线流程图、项目管理、任务分发、即时IM文件管理等工具同时消息功能使用非对称加密技术让你的沟通更安全。项目地址https://gitcode.com/gh_mirrors/do/dootask点击查看免费下载DooTask在线项目任务管理工具的「退出登录」并非简单清空前端会话而是一次完整的设备凭证销毁流程前端调用api/users/logout后端删除当前设备的UserDevice记录、使 token 立即失效并跳回登录页。本文基于 DooTask 官方 AI 知识库文档 logout.md结合仓库源码讲解退出登录的入口、操作步骤、背后机制、与「切换账号」「注销账号」的区别以及源码实现细节帮助普通用户正确退出、帮助开发者理解 token 与设备管理模型。一、退出登录的入口DooTask 所有端Web 桌面端、移动端、桌面客户端都提供了退出登录入口位置略有差异端入口路径桌面端Web/浏览器右上角头像 → 下拉菜单 →「退出登录」移动端App底部 Tabbar「我的」→ 顶部头像区下方 →「退出登录」桌面客户端与桌面端一致右上角头像 → 下拉菜单 →「退出登录」提示客户端Electron 桌面客户端与 Web 共用同一套账号体系与 token 机制因此退出逻辑完全一致。二、操作步骤退出登录的交互链路非常简单共三步点击「退出登录」界面弹出确认对话框确认后前端调用api/users/logout接口后端清除当前设备的 token 凭证前端自动跳转到登录页。从 routes/api-map.md 可以确认该接口的定义接口控制器方法方法说明api/users/logoutlogout()GET退出登录api/users/device/logoutdevice__logout()GET登出设备删除设备api/users/token/expiretoken__expire()GET查询 token 过期时间可以看到「退出登录」与「登出某个设备」是两个不同的接口前者登出当前设备自己后者用于在设备管理里远程踢下线其他设备详见 设备管理文档。三、退出后到底发生了什么源码级解析退出登录背后是一次设备记录删除操作。控制器实现位于 app/Http/Controllers/Api/UsersController.phppublic function logout() { UserDevice::forget(); return Base::retSuccess(退出成功); }整个方法只有两行调用UserDevice::forget()删除当前设备记录然后返回「退出成功」。真正的逻辑全部封装在 app/Models/UserDevice.php 的forget()方法中public static function forget(UserDevice|string|int $token null): void { if ($token instanceof UserDevice) { $hash $token-hash; $token-delete(); } elseif (Base::isNumber($token)) { $row self::find(intval($token)); if ($row) { $hash $row-hash; $row-delete(); } } else { if ($token null) { $token Doo::userToken(); } if ($token) { $hash md5($token); self::whereHash($hash)-delete(); } } if (isset($hash)) { Cache::forget(self::ck($hash)); UmengAlias::whereDeviceHash($hash)-delete(); } }调用logout()时传入参数为nullforget()会取当前请求携带的 tokenDoo::userToken()计算其 MD5 作为hash然后执行以下三件事删除user_devices表中的设备记录self::whereHash($hash)-delete()。由于该表使用SoftDeletes见 create_user_devices_table.php 迁移文件实际是逻辑删除deleted_at写入时间戳但查询时默认会过滤已删除记录效果等同于失效。清除缓存中的设备凭证Cache::forget(self::ck($hash))。ck()生成的缓存键为user_devices:{hash}该缓存由record()方法在记录设备时写入缓存 1 小时forget()将其一并删除。删除推送别名绑定UmengAlias::whereDeviceHash($hash)-delete()解除该设备与友盟推送服务别名的关联避免退出后仍收到消息推送。为什么旧 token 再调接口会返回 401退出登录后旧 token 无法通过认证原因是认证链路上每一环都断了。核心认证逻辑位于 app/Models/User.php 的authInfo()方法if (Doo::userExpired()) { // 登录过期 return RequestContext::save(auth, false); } if (!UserDevice::check()) { // token 不存在 return RequestContext::save(auth, false); }其中UserDevice::check()见 UserDevice.php会做三件事检查缓存user_devices:{hash}是否存在——退出时已被清除缓存命中失败查询user_devices表中是否存在对应hash记录——退出时已被逻辑删除查不到若记录存在但已过期expired_at早于当前时间则自动执行self::forget($row)删除并返回null。任一环节失败authInfo()都返回false接口层随即返回 401前端检测到后强制跳回登录页。这解释了文档中「继续用旧 token 调接口会返回 401」的现象。四、退出登录的三个边界不影响其他设备、不是注销、不保留草稿官方文档明确列出三个易混淆点本文结合源码逐一澄清1. 退出登录只影响当前设备logout()中UserDevice::forget()传null只操作当前请求 token 对应的 hash其他设备在user_devices表中各自持有独立的 hash 记录不受影响。因此你在手机退出登录电脑端的会话依然有效若想全设备登出需要到「个人设置 → 账号安全 → 登录设备」设备管理文档里逐个登出或使用api/users/device/logout?idxxx远程踢下线指定设备。设备列表接口device__list()的实现也印证了这一点——它按当前用户userid查询全部设备记录UsersController.php$list UserDevice::whereUserid($user-userid)-orderByDesc(id)-take(UserDevice::$deviceLimit)-get();2. 退出登录 ≠ 注销账号退出登录只是销毁当前设备的登录凭证账号本身与账号数据完全保留下次用同一邮箱密码或扫码可再次登录。真正的「注销账号」入口位于「个人设置 → 账号安全 → 底部注销账号」注销后会清空 token 并标记用户删除详见 注销账号文档。两者的本质区别退出登录走UserDevice::forget()删设备记录注销账号则走用户删除流程写user_deletes快照表、token 全设备失效、历史记录显示为「已注销用户」。3. 退出后未发送/草稿消息不保留DooTask 不支持「退出后保留聊天草稿」。草稿属于前端本地会话状态退出登录跳转登录页后本地会话上下文被清理未发送的内容不会自动保存。五、切换账号与多账号并行退出登录最常用的场景就是切换账号。DooTask 的机制是当前账号退出后自动跳转登录页在登录页直接输入其他邮箱登录即可登录方式支持邮箱密码、扫码登录、LDAP、SSO详见 登录账号文档。需要注意DooTask不支持「同时登录多个账号」——每个浏览器/客户端同一时刻只能持有一份有效 token。官方给出的多账号并行方案桌面端使用多个浏览器配置如不同浏览器、无痕窗口、多用户 Profile客户端使用客户端的「多开」入口运行多个实例。从代码层面看同一设备重复登录时UserDevice::record()是按 token 的 MD5 生成独立 hash 的新登录会写入新记录但认证时authInfo()依赖请求头中携带的单个 token解析出唯一用户因此前端同一会话内无法同时持有两个身份。六、token 有效期为什么不支持「保持登录」文档指出 DooTask 不支持「保持登录」勾选项token 有效期统一由管理员在系统设置中配置默认 30 天。源码佐证位于 app/Models/User.php 的generateToken()方法if ($refresh) { $days $userinfo-bot ? 0 : max(1, intval(Base::settingFind(system, token_valid_days, 30))); $token Doo::tokenEncode($userinfo-userid, $userinfo-email, $userinfo-encrypt, $days); }关键点解读有效期配置项为系统设置中的system.token_valid_days通过Base::settingFind()app/Module/Base.php读取默认值 30天配置值取max(1, intval(...))即管理员即使填 0 或负数也会被强制钳制为至少 1 天机器人账号bot的特例token 有效天数为 0即长期有效不受该配置约束由于 token 自带有效期且是服务端强校验的Doo::userExpired()在authInfo()认证阶段即被检查所以前端没有「保持登录」的必要——有效期策略完全由服务端统一管控。此外DooTask 还提供 token 续期机制api/users/token/expire接口UsersController.php可查询剩余有效期且当 token 剩余有效期不足总有效期的 1/3 时可通过refresh1参数换取新 token移动端iOS/Android在api/users/info请求中也会自动触发同样的续期逻辑UsersController.php。user_devices 表结构速览退出登录操作的目标表user_devices由迁移文件 2025_04_19_084905_create_user_devices_table.php 定义核心字段如下字段类型说明idbigIncrements主键也是device/logout接口的id参数useridbigInteger索引所属会员 IDhashstring索引token 的 MD5设备凭证的唯一标识detaillongText设备详细信息IP、类型、OS、浏览器、客户端版本等 JSONexpired_attimestamptoken 过期时间deleted_attimestampSoftDeletes逻辑删除标记值得注意的限制每用户设备记录上限由UserDevice::$deviceLimit 200控制UserDevice.php新设备写入时若超出上限会自动按id升序淘汰最旧的设备记录UserDevice.php。七、常见疑问速查退出登录后还能登录回来吗能。账号未删除用原邮箱密码登录即可。退出登录会清空聊天记录吗不会。消息历史保存在服务端退出只影响当前会话凭证。手机退出后电脑会掉线吗不会。设备凭证相互独立需全设备登出请用设备管理逐个操作。退出后还能收到推送吗不能。forget()会同步删除该设备的UmengAlias推送别名绑定。token 快过期了怎么办系统会在剩余有效期不足 1/3 时自动续期移动端自动、Web 可调用api/users/token/expire?refresh1无需手动重新登录。总结DooTask 的「退出登录」是一个以UserDevice::forget()为核心的设备凭证销毁流程删除user_devices设备记录、清除缓存、解绑推送别名使旧 token 在认证链路上authInfo()→UserDevice::check()彻底失效并返回 401。它只影响当前设备、不删除账号、不保留草稿token 有效期由管理员通过system.token_valid_days统一配置默认 30 天。理解这套机制既能正确完成日常退出与切换账号操作也能为二次开发中涉及 token、设备管理与多端会话控制的场景提供清晰依据。赞分享后端前端协同办公即时通讯企业应用【免费下载链接】dootaskDooTask是一款开源在线项目任务管理工具提供各类文档协作工具、在线思维导图、在线流程图、项目管理、任务分发、即时IM文件管理等工具同时消息功能使用非对称加密技术让你的沟通更安全。项目地址https://gitcode.com/gh_mirrors/do/dootask点击查看免费下载相关推荐DooTask 退出登录登出功能详解入口路径、操作流程与后端实现DooTask 退出登录登出功能详解入口路径、操作流程与后端实现 DooTask 在 Web、Electron 桌面客户端与移动端均提供「退出登录」入口后端前端协同办公即时通讯企业应用DooTask 新建会议完整实战指南入口、操作步骤与源码级原理剖析DooTask 新建会议完整实战指南入口、操作步骤与源码级原理剖析 DooTask 内置了基于 Agora声网RTC 的即时视频会议能力用户无需任何插件后端前端协同办公即时通讯企业应用DooTask 数据导出功能全解析管理员入口定位、四类导出操作与源码级实现原理DooTask 数据导出功能全解析管理员入口定位、四类导出操作与源码级实现原理 DooTask 内置的「数据导出」是面向系统管理员的后台能力可将任务、审批、后端前端协同办公即时通讯企业应用上一篇3分钟上手Unity语音识别神器Whisper.unity全攻略下一篇ObservableValidator在MVVM-Samples中的应用构建验证表单的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?