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 系列演算法,例如 HS256HS384HS512 演算法。

    • 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 群組 提供回饋與建議。