少走點彎路:Wiki.js 通過 Generic OAuth2 進行身份驗證

Wiki.js介紹

Wiki.js 是一個開源的百科全書系統,可以用來搭建自己的知識庫、文檔庫等。
官網 | GitHub

後續內容中的Wiki.js會用Wiki代替。
本文環境:Wiki 2.5.289

Wiki的基本環境搭建和使用,網上一大堆,本文就不在累贅。
使用過程中,需要用到身份驗證時,發現出錯後頁面提示資訊不是很友好,最後也是通過調試源碼後配置成功,所以還是很有必要記錄一下配置方式。

基本的配置包含2個部分,分別是授權配置註冊配置

1. 授權配置

Authorization.png
個人認為這部分是最不友好的地方,卡殼也是卡在這裡。

1.1 Client ID

獲取 Token 時會作為參數傳遞給介面。

1.2 Client Secret

獲取 Token 時會作為參數傳遞給介面。

1.3 Authorization Endpoint URL

授權頁面的地址。
當進入 Wiki 的登錄頁後,選擇 Generic OAuth2 授權登錄時跳轉的地址。
如果同意授權,則需要跳轉到 Wiki 指定的回調頁面(跳轉時可以加入自定義參數)。
每個項目的回調地址都不相同,最簡單的辦法就是在頁面的最下面找到配置參考。
//xxx:3000/login/bf4439-a770-fedee4be57df/callback?MyValue=test
如果回調地址配置的不對,可能會出現Invalid authentication provider.錯誤頁。
demo.png

1.4 Token Endpoint URL

獲取Token的介面地址。

在調用該地址時,Wiki會自動附帶下面這些參數:

  1. grant_type=authorization_code
  2. client_id=1.1中配置的值
  3. client_secret=1.2中配置的值
  4. 自定義參數(1.3中配置的值)

服務端驗證邏輯完成後,介面必須返回包含以下欄位的返回值(注意區分大小寫

{
    "access_token":"xxx"
}

如果返回值不合法,會出現錯誤頁Failed to obtain access token

1.5 User Info Endpoint URL

成功拿到Token後,獲取用戶資訊的介面地址。

可以設置 Wiki 獲取用戶資訊時 Token 的傳遞方式:Query stringAuthorization header
SetToken.png

伺服器根據 Token 獲取用戶資訊,最終返回包含以下欄位的返回值(注意區分大小寫

{
    "UserId":10086,
    "Name":"張三",
    "Email":"[email protected]"
}

如果返回值不合法,會出現錯誤頁Missing or invalid email address from profile.

Wiki 系統中是通過 Email 來標識唯一用戶,因此不同用戶的 Email 不能重複。

1.6 ID Claim

用戶資訊介面中返回的用戶 ID 欄位名。

1.7 Display Name Claim

用戶資訊介面中返回的用戶名稱欄位名。

1.8 Email Claim

用戶資訊介面中返回的郵箱欄位名,該欄位值必須保證唯一。

UserInfo.png

2. 註冊配置

Config.png

2.1 啟用開放註冊

授權登錄完成後,當用戶資訊在 Wiki 中不存在時,則會新建用戶資訊並完成登錄。

2.1 禁用開放註冊

授權用戶的 Email 必須已經在 Wiki 中註冊,否則無法登錄,出現錯誤頁You are not authorized to login.