一、 整体流程概览
微博回复功能的实现主要围绕 OAuth 2.0 授权体系 展开,旨在通过微博开放平台获取临时授权码(Code),并由后端换取 AccessToken 以代表官方账号执行回复操作。
1.1 前端核心组件
- 主体页面: — 负责启动授权流程、监控状态、提交回复内容。
- 中转页面: — 关键环节。部署在静态资源根目录,作为微博授权后的回调地址(
redirect_uri)。
1.2 详细交互步骤
-
权限校验:点击“提交”时,先通过接口
checkWeiboAccessToken确认后端是否有可用的 Token。 -
唤起授权:若无 Token,前端调用
startWeiboAuth:- 构造微博授权 URL,指定
redirect_uri为服务器上的weibo-callback.html。 - 使用
window.open开启一个弹窗,并同时启动定时监听器startWeiboAuthListener。
- 构造微博授权 URL,指定
-
用户扫码:用户在弹窗中完成微博扫码授权。
- 回调处理:
- 微博服务器重定向至
weibo-callback.html?code=XXXX。 - 回调页面解析 URL 中的
code,将其存入localStorage(键名为weibo_auth_code)。 - 回调页面完成使命并延时自动关闭。
- 微博服务器重定向至
- 捕获 Code:主页面监听器检测到
localStorage变化或弹窗关闭后,读取code并保存到组件状态中。 - 最终提交:携带
code调用后端的回复接口,后端利用此code进行后续的 Token 交换与发评操作。
二、 关键点:weibo-callback.html 的作用与部署
在本项目中,weibo-callback.html 是连接“微博平台”与“本地应用”的通讯桥梁,解决了跨域通讯的难题。
2.1 为什么要单独创建一个 HTML 文件放到服务器?
- 安全限制:由于主页面与微博授权页面处于不同域名,主页面无法直接读取授权弹窗内的 URL 或内容。
- 域内通讯:通过将重定向地址设为应用同域下的静态 HTML,使得授权弹窗在重定向后回到“自己家”的域内。此时,回调页面写入的
localStorage可以被主页面直接访问,从而实现跨窗口的数据传递。
2.2 部署位置
- 路径:必须放置在前端项目的静态资源目录(如
public/)。 - 服务器映射:确保线上环境通过
http://域名/weibo-callback.html能够被外部访问。
三、 技术难点与解决方案
3.1 难点:如何实时感知弹窗内的授权结果?
挑战:用户在弹窗操作,主页面处于“非活动”等待状态,传统的父子组件通信在此失效。
解决方案:
- 双重监听机制:
- 定时轮询 (setInterval):在
vue组件页面中每 500ms 检查一次localStorage里的特定 Key。 - 窗口监控:监控
weiboAuthWindow.closed状态。如果用户手动关掉窗口但没获取到 Code,则提示授权取消。
- 定时轮询 (setInterval):在
- 数据隔离:使用带时间戳的 JSON 对象存储 Code,防止读取到过期的旧代码。
3.2 难点:AccessToken 过期或未配置
挑战:授权完成后,后端可能上报 Token 已配置但实际上已经失效,或者管理员根本没在后台配置 AppKey。
解决方案:
- 细分错误状态:在
checkWeiboAccessToken中对返回的消息进行精确字符串匹配(如 "微博授权信息未配置"、"accessToken为空" 等),根据不同提示引导用户:要么联系管理员,要么触发扫码。
3.3 难点:用户体验的丝滑度
挑战:授权过程涉及弹窗跳转,容易被浏览器拦截或被用户误关。
解决方案:
- 居中弹窗:通过 JS 计算屏幕坐标,确保授权弹窗显示在屏幕中央。
- 加载状态全覆盖:使用
$message.loading阻止用户重复点击,并实时显示“正在等待授权”的反馈。
四、 总结
该功能通过 "主窗口监听 + 静态回调页桥接 + LocalStorage 存储" 的模式,避开了浏览器复杂的跨域策略,实现了一套低耦合、高可靠的微博第三方接入方案。