LangChat Pro 社交登录实施方案
一、方案概述
1.1 背景
LangChat Pro 需要支持多种社交登录方式,以满足不同用户群体的登录需求。本方案设计并实现以下社交登录功能:- 企业微信登录:适用于企业内部用户扫码登录
- 微信开放平台登录:适用于 C 端用户扫码登录
- 钉钉登录:适用于企业用户扫码登录
- 邮箱登录:使用邮箱验证码登录
- 手机验证码登录:使用阿里云短信服务
1.2 设计目标
- 统一抽象:定义统一的社交登录接口和策略模式
- 易于扩展:新增登录方式只需实现接口,无需修改核心逻辑
- 用户绑定:支持社交账号与本地账号的绑定
- 自动注册:新用户自动创建账号
- 安全可靠:所有登录方式均使用安全的认证流程
1.3 技术选型
| 登录方式 | 实现方式 | 版本 |
|---|---|---|
| 企业微信 | HTTP API + Hutool HttpUtil | - |
| 微信开放平台 | HTTP API + Hutool HttpUtil | - |
| 钉钉 | HTTP API + Hutool HttpUtil | - |
| 邮件 | javax.mail | 1.6.2 |
| 短信 | 阿里云短信服务 SDK | 最新 |
二、架构设计
2.1 整体架构
2.2 核心组件
2.2.1 SocialLoginStrategy(社交登录策略接口)
所有登录方式需要实现的统一接口:2.2.2 SocialLoginFactory(策略工厂)
根据登录类型创建对应的策略实例:2.2.3 SocialLoginHandler(用户处理)
处理用户创建、绑定和会话管理:2.3 数据模型设计
2.3.1 社交账号绑定表
三、配置说明
3.1 配置文件结构
在application.yml 中配置:
3.2 配置属性类
四、接口设计
4.1 API 端点
| 端点 | 方法 | 说明 |
|---|---|---|
/auth/social/types | GET | 获取可用的登录类型 |
/auth/social/authorize/{type} | GET | 获取授权URL |
/auth/social/callback/{type} | GET | 社交平台回调(重定向到前端) |
/auth/social/login | POST | 社交登录 |
/auth/social/code/send | POST | 发送验证码 |
/auth/social/code/verify | POST | 验证验证码并登录 |
/auth/social/bind | POST | 绑定社交账号 |
/auth/social/unbind/{type} | DELETE | 解绑社交账号 |
/auth/social/bindings | GET | 获取已绑定账号 |
4.2 登录类型枚举
4.3 自定义反序列化器
支持从 code(如"enterprise_wechat")或枚举名(如 "ENTERPRISE_WECHAT")反序列化:
五、第三方平台配置
5.1 企业微信扫码登录
官方文档:https://developer.work.weixin.qq.com/document/path/91039 授权 URL 格式:- CorpID:企业 ID
- AgentID:自建应用 ID
- Secret:应用密钥
- OAuth可信域名:前端页面域名
- IP白名单:服务器出口 IP
5.2 微信开放平台扫码登录
授权 URL 格式:5.3 钉钉扫码登录
授权 URL 格式:5.4 回调配置说明
回调配置需要特别注意:- redirect_uri:企业微信/微信/钉钉后台配置的回调地址域名必须一致
- callback-url:配置为前端可访问的地址,用于扫码后重定向
六、安全设计
6.1 CSRF 防护
使用 state 参数防止 CSRF 攻击:6.2 授权码安全
- 授权码一次性使用
- 授权码有效期 5 分钟
- 使用后立即失效
6.3 默认菜单保护
当用户没有任何菜单权限时,系统默认返回探索首页:七、前端集成
7.1 社交登录页面
前端通过/auth/social-login 页面处理社交登录:
- 有 type 参数:获取授权 URL 并跳转到第三方
- 有 code 和 state 参数:调用登录接口
- 无参数:跳转到登录页
7.2 路由守卫
在路由守卫中添加社交登录回调处理:7.3 登录按钮
在登录页面添加社交登录按钮:八、后续优化
- 多平台绑定优化:支持用户绑定多个社交账号
- 小程序登录:支持微信小程序登录
- 海外平台:支持 Google、Facebook 登录
- 登录统计:登录数据分析报表
- SSO 集成:与企业内部 SSO 系统集成

