Egg.js 搭建 JWT/OAuth 认证服务器

3,190 阅读1分钟
原文链接: zhuanlan.zhihu.com
公司内部账号系统需要提供统一的认证接口

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. 组件

egg-oauth2-server 我fork了一份,因为赶时间,所以调试频率比较高,并在 npm 上发了一个版本,建议优先使用 Azard 的版本

5. 示例

在正式环境我使用NodeBB做测试,使用 nodebb-plugin-sso-oauth 的修改版 nodebb-plugin-sso-oauth-arashivision

  • 登录页面
  • 授权页面(请忽略样式!)
  • 授权成功(默认用钉钉的用户信息作为用户名)

友情出镜: @大踏步的流浪汉 @illusate 😀