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 代碼整潔之道》

TAG:前端开发 | eggjs |