OAuth2 系統(實驗性質)#
Xinference 使用了帳號密碼的模式,建構了一個基於記憶體的 OAuth2 身分驗證與授權系統。
備註
如果沒有身份驗證和授權的要求,可以像之前一樣使用 Xinference,無需任何改動。
權限#
目前,Xinference 內部定義了以下幾個介面權限:
models:list: 取得模型清單與資訊的權限。models:read: 使用模型的權限。models:register: 註冊模型的權限。models:unregister: 取消註冊模型的權限。models:start: 啟動模型的權限。models:stop: 停止模型的許可權。admin:管理員擁有所有介面的權限。
開始使用#
啟動 Xinference 時,需要指定所有的驗證和授權資訊。目前,Xinference 需要一個 JSON 檔案,其中包含以下特定欄位:
{
"auth_config": {
"algorithm": "HS256",
"secret_key": "09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7",
"token_expire_in_minutes": 30
},
"user_config": [
{
"username": "user1",
"password": "secret1",
"permissions": [
"admin"
],
"api_keys": [
"sk-72tkvudyGLPMi",
"sk-ZOTLIY4gt9w11"
]
},
{
"username": "user2",
"password": "secret2",
"permissions": [
"models:list",
"models:read"
],
"api_keys": [
"sk-35tkasdyGLYMy",
"sk-ALTbgl6ut981w"
]
}
]
}
auth_config:此欄位設定與安全相關的資訊。algorithm: 用於令牌生成與解析的演算法。推薦使用HS系列演算法,例如HS256、HS384或HS512演算法。secret_key:用於令牌生成和解析的密鑰。可以使用該命令生成適用於HS系列算法的密鑰:openssl rand -hex 32。token_expire_in_minutes: 保留欄位,表示令牌失效時間。目前 Xinference 開源版本不會檢查令牌過期時間。
user_config:此欄位用於設定使用者與權限資訊。每個使用者資訊由以下欄位組成:username:字串,表示使用者名稱password:字串,表示密碼permissions: 字串列表,表示該使用者擁有的權限。權限描述如上權限部分文件所述。api_keys: 字串列表,表示該用戶擁有的 api-key。用戶可以透過這些 api-key,無需登入步驟即可存取 xinference 介面。此處的 api_key 組成與OPENAI_API_KEY相似,總是以sk-開頭,後接 13 個數字、大小寫字母。
配置好這樣一個 JSON 檔案後,可以使用 --auth-config 選項啟用具有身份驗證和授權系統的 Xinference。例如,本地啟動的指令如下所示:
xinference-local -H 0.0.0.0 --auth-config /path/to/your_json_config_file
在分散式環境下,只需要在啟動 supervisor 時指定這個選項:
xinference-supervisor -H <supervisor_ip> --auth-config /path/to/your_json_config_file
使用#
使用帶有權限管理的 Xinference 服務與正常的版本保持一致,只是在開始階段添加了登錄步驟,或者使用 api-key 進行鑑權。
基於使用者名稱-密碼的使用方式#
使用命令列登入:
xinference login -e <endpoint> --username <username> --password <password>
使用 Python SDK 登入:
from xinference.client import Client
client = Client('<endpoint>')
client.login('<name>', '<pass>')
對於 Web UI 的使用者,在打開 Web UI 時,將會先跳轉到登入頁面。登入後,即可正常使用 Web UI 的功能。
基於 Api-Key 鑑權的使用方式#
對於命令列用戶,僅需在所要執行的命令上新增 --api-key 或 -ak 選項即可。
xinference launch <other options> --api-key <your_api_key>
對於 Python 客戶端使用者,在客戶端物件初始化時傳入 api_key 參數即可,就像 OPENAI 客戶端那樣。
from xinference.client import Client
client = Client('<endpoint>', api_key='<your_api_key>')
當然,Xinference 也與 OPENAI Python 用戶端的使用方式完全相容。
from openai import OpenAI
client = OpenAI(base_url="<xinference endpoint>" + "/v1", api_key="<your_api_key>")
client.models.list()
對於 HTTP 請求,在請求頭中傳遞 Authorization: Bearer api-key。
curl --request GET \
--url "<xinference endpoint>" \
--header "Authorization: Bearer <your_api_key>"
HTTP 狀態碼#
添加了以下兩種 HTTP 狀態碼:
401 Unauthorized:登入資訊或令牌驗證失效。403 Forbidden:沒有足夠的權限存取介面。
對於命令列、SDK 或 Web UI 使用者,在遇到授權和權限問題時,會有明確的資訊提示。
注意#
該功能處於實驗階段。歡迎通過 GitHub issues 或者 Telegram 群組 提供回饋與建議。