公司内部账号系统需要提供统一的认证接口
1. 需求
- 账号系统(数据源)
- 钉钉
- 其他(历史遗留账号)
- 认证方式
- JWT
- OAuth
- 系统资源
- 用户
- 组别
- 角色
- 权限
2. 实现
2.1数据表
- 权限
- 角色
- 用户
- oauth
3. 流程
上述为内部账号系统所包含的一些基本信息,其中钉钉是基础用户信息的来源
3.1 获取用户信息
用户 --> 钉钉应用 --> 免登CODE --> 换取Token --> 获取用户信息 --> 存储到用户表
3.2 jwt 认证
用户 --> 网页应用 --> 账号密码登录 --> 验证用户 --> 返回 JwtToken
3.3 oauth 认证
3.3.1 password
getClient --> getUser --> saveToken --> 返回 accessToken
3.3.2 authorization_code
getClient --> getUser --> saveAuthorizationCode --> 返回 code
getClient --> getAuthorizationCode --> saveToken --> revokeAuthorizationCode --> 返回 accessToken
4. 组件
- 用户信息获取
- jwt 认证(最好和其他后端服务共用key)
- oauth 认证(文档里介绍的基本比较清楚了,可以看示例)
egg-oauth2-server 我fork了一份,因为赶时间,所以调试频率比较高,并在 npm 上发了一个版本,建议优先使用 Azard 的版本
5. 示例
在正式环境我使用NodeBB做测试,使用 nodebb-plugin-sso-oauth 的修改版 nodebb-plugin-sso-oauth-arashivision
- 登录页面
- 授权页面(请忽略样式!)
- 授权成功(默认用钉钉的用户信息作为用户名)