Egg.js 搭建 JWT/OAuth 認證伺服器
公司內部賬號系統需要提供統一的認證介面
1. 需求
- 賬號系統(數據源)
- 釘釘
- 其他(歷史遺留賬號)
- 認證方式
- JWT
- OAuth
- 系統資源
- 用戶
- 組別
- 角色
- 許可權
2. 實現
2.1數據表
- 許可權
- 角色
- 用戶
- oauth
3. 流程
上述為內部賬號系統所包含的一些基本信息,其中釘釘是基礎用戶信息的來源
3.1 獲取用戶信息
用戶 --> 釘釘應用 --> 免登CODE --> 換取Token --> 獲取用戶信息 --> 存儲到用戶表n
3.2 jwt 認證
用戶 --> 網頁應用 --> 賬號密碼登錄 --> 驗證用戶 --> 返回 JwtTokenn
3.3 oauth 認證
3.3.1 password
getClient --> getUser --> saveToken --> 返回 accessTokenn
3.3.2 authorization_code
getClient --> getUser --> saveAuthorizationCode --> 返回 codengetClient --> getAuthorizationCode --> saveToken --> revokeAuthorizationCode --> 返回 accessTokenn
4. 組件
- 用戶信息獲取
- 免登服務
- egg-dingtalk
- jwt 認證(最好和其他後端服務共用key)
- egg-jwt
- oauth 認證(文檔里介紹的基本比較清楚了,可以看示例)
- egg-oauth2-server
egg-oauth2-server 我fork了一份,因為趕時間,所以調試頻率比較高,並在 npm 上發了一個版本,建議優先使用 Azard 的版本
5. 示例
在正式環境我使用NodeBB做測試,使用 nodebb-plugin-sso-oauth 的修改版 nodebb-plugin-sso-oauth-arashivision
- 登錄頁面
- 授權頁面(請忽略樣式!)
- 授權成功(默認用釘釘的用戶信息作為用戶名)
友情出鏡: @大踏步的流浪漢 @illusate ??
推薦閱讀:
※[git 進階] 同一電腦同時配置 github 和 gitlab
※【掘金小報】第七期 你怎麼看待技術圈撕逼?
※精讀《React 代碼整潔之道》