使用 OAuth (OAuth M2M) 透過服務主體對 Azure Databricks 的存取進行驗證
本文說明如何建立 Azure Databricks 服務主體,並使用它向具有 OAuth 的目標實體進行驗證。
步驟 1:建立服務主體
帳戶管理員和工作區管理員可以建立服務主體。 此步驟說明在工作區中建立服務主體。 若要使用帳戶主控台,請參閱 您的帳戶中的管理服務主體。
您也可以建立Microsoft Entra ID 受控服務主體,並將其新增至 Azure Databricks。 如需詳細資訊,請參閱 Databricks 和 Microsoft Entra ID 服務主體。
- 身為工作區管理員,登入 Azure Databricks 工作區。
- 按下 Azure Databricks 工作區頂端列中的使用者名稱,然後選取 [設定]。
- 按一下 [身分識別與存取] 索引標籤。
- 在 [服務主體] 旁邊,按一下 [管理]。
- 按一下 [新增服務主體]。
- 單擊搜尋方塊中的下拉式箭號,然後按兩下 [ 新增]。
- 在 [管理] 底下,選擇 [Databricks 受控]。
- 輸入服務主體的名稱。
- 按一下新增。
服務主體會同時新增至您的工作區和 Azure Databricks 帳戶。
步驟 2:將許可權指派給服務主體
- 按兩下服務主體的名稱,以開啟其詳細數據頁面。
- 在 [組態] 索引標籤上,核取您希望服務主體為此工作區擁有的每個權利旁邊的方塊,然後按一下 [更新]。
- 在 [權限] 索引標籤上,授與您想要管理及使用此服務主體的任何 Azure Databricks 使用者、服務主體和群組的存取權。 請參閱管理服務主體上的角色。
步驟 3:建立服務主體的 OAuth 秘密
您必須先建立可用於產生 OAuth 存取權杖的 OAuth 祕密,然後才能使用 OAuth 向 Azure Databricks 進行驗證。 服務主體最多可以具有五個 OAuth 祕密。 帳戶管理員和工作區管理員可以建立服務主體的 OAuth 秘密。
在服務主體的詳細數據頁面上,按兩下 [ 秘密] 索引標籤 。
在 [OAuth 祕密] 下,按一下 [產生祕密]。
複製顯示的 [秘密 ] 和 [用戶端標識符],然後按兩下 [ 完成]。
祕密在建立期間僅顯示一次。 用戶端識別碼與服務主體的應用程式識別碼相同。
帳戶管理員也可以從帳戶控制台中的服務主體詳細數據頁面產生 OAuth 秘密。
身為帳戶管理員,登入帳戶主機。
按下使用者管理。
在 [ 服務主體] 索引標籤上 ,選取您的服務主體。
在 [OAuth 祕密] 下,按一下 [產生祕密]。
複製顯示的 [秘密 ] 和 [用戶端標識符],然後按兩下 [ 完成]。
步驟 4:使用 OAuth M2M 驗證
若要使用 OAuth M2M 驗證,您必須設定下列相關聯的環境變數、 .databrickscfg
欄位、Terraform 欄位或 Config
字段:
- Azure Databricks 主機,指定為
https://accounts.azuredatabricks.net
(對於帳戶作業) 或目標個別工作區 URL,例如https://adb-1234567890123456.7.azuredatabricks.net
(對於工作區作業)。 - Azure Databricks 帳戶識別碼 (對於 Azure Databricks 帳戶作業)。
- 服務主體用戶端識別碼。
- 服務主體祕密。
若要執行 OAuth M2M 驗證,請根據參與工具或 SDK 將下列內容整合到您的程式碼中:
Environment
若要透過工具或 SDK 將環境變數用於特定 Azure Databricks 驗證類型,請參閱對 Azure Databricks 資源的存取進行驗證或者參閱工具或 SDK 的文件。 另請參閱用戶端統一驗證的環境變數和欄位和用戶端統一驗證的預設方法。
針對帳戶層級作業,請設定下列環境變數:
DATABRICKS_HOST
,設定為 Azure Databricks 帳戶主控台 URL (https://accounts.azuredatabricks.net
)。DATABRICKS_ACCOUNT_ID
DATABRICKS_CLIENT_ID
DATABRICKS_CLIENT_SECRET
針對工作區層級作業,請設定下列環境變數:
DATABRICKS_HOST
,設定為 Azure Databricks 個別工作區網址,例如https://adb-1234567890123456.7.azuredatabricks.net
。DATABRICKS_CLIENT_ID
DATABRICKS_CLIENT_SECRET
設定檔
使用 .databrickscfg
檔案中的下列欄位,建立或識別 Azure Databricks 組態設定檔。 如果您建立設定檔,請將預留位置取代為適當的值。 若要透過工具或 SDK 使用設定檔,請參閱對 Azure Databricks 資源的存取進行驗證或者參閱工具或 SDK 的文件。 另請參閱用戶端統一驗證的環境變數和欄位和用戶端統一驗證的預設方法。
針對帳戶層級作業,請在您的 .databrickscfg
檔案中設定下列值。 在此情況下,Azure Databricks 帳戶主控台網址為 https://accounts.azuredatabricks.net
:
[<some-unique-configuration-profile-name>]
host = <account-console-url>
account_id = <account-id>
client_id = <service-principal-client-id>
client_secret = <service-principal-secret>
針對工作區層級作業,請在您的 .databrickscfg
檔案中設定下列值。 在此情況下,主機是 Azure Databricks 個別工作區網址,例如 https://adb-1234567890123456.7.azuredatabricks.net
:
[<some-unique-configuration-profile-name>]
host = <workspace-url>
client_id = <service-principal-client-id>
client_secret = <service-principal-secret>
CLI
針對 Databricks CLI,請執行下列其中一項:
- 按照本文的「環境」一節所述,設定環境變數。
- 按照本文的「設定檔」一節所述,設定
.databrickscfg
檔案中的值。
環境變數始終優先於 .databrickscfg
檔案中的值。
另請參閱 OAuth 機器對機器 (M2M) 驗證。
連線
注意
下列 Databricks Connect 版本支援 OAuth M2M 驗證:
- 對於 Python,為 Databricks Connect for Databricks Runtime 14.0 和更新版本的。
- 針對 Scala,即為適用於 Databricks Runtime 13.3 LTS 和更新版本的 Databricks Connect。 Databricks Connect for Databricks Runtime 13.3 LTS 和更新版本隨附的 Databricks SDK for Java 必須升級至 Databricks SDK for Java 0.17.0 或更新版本。
針對 Databricks Connect,您可以執行下列其中一項:
- 按照本文的「設定檔」一節所述,為 Azure Databricks 工作區層級作業設定
.databrickscfg
檔案中的值。 此外,將設定檔中的cluster_id
環境變數設定為個別工作區網址,例如https://adb-1234567890123456.7.azuredatabricks.net
。 - 按照本文的「環境」一節所述,為 Azure Databricks 工作區層級作業設定環境變數。 此外,將
DATABRICKS_CLUSTER_ID
環境變數設定為個別工作區網址,例如https://adb-1234567890123456.7.azuredatabricks.net
。
.databrickscfg
檔案中的值始終優先於環境變數。
若要使用 .databrickscfg
檔案中的這些環境變數或值來初始化 Databricks Connect 用戶端,請參閱下列其中一項:
- 針對 Python,請參閱設定 Python 的連線屬性。
- 針對 Scala,請參閱 設定 Scala 的連線屬性。
VS Code
針對適用於 Visual Studio Code 的 Databricks 延伸項目,請執行下列動作:
- 按照本文的「設定檔」一節所述,為 Azure Databricks 工作區層級作業設定
.databrickscfg
檔案中的值。 - 在適用於 Visual Studio Code 的 Databricks 延伸項目的 [設定] 窗格中,按下 [設定 Databricks]。
- 在 [命令選擇區] 中,針對 [Databricks 主機],輸入個別工作區網址,例如
https://adb-1234567890123456.7.azuredatabricks.net
,然後按Enter
。 - 在 [命令選擇區] 中,在您的網址清單中選取目標設定檔名稱。
如需詳細資料,請參閱適用於 Visual Studio Code 的 Databricks 延伸項目的驗證設定。
Terraform
provider "databricks" {
alias = "accounts"
}
針對直接組態 (將 retrieve
預留位置取代為您自己的實作,以從主控台或某些其他設定存放區 (例如 HashiCorp Vault) 擷取值。另請參閱 Vault 提供者)。 在此情況下,Azure Databricks 帳戶主控台網址為 https://accounts.azuredatabricks.net
:
provider "databricks" {
alias = "accounts"
host = <retrieve-account-console-url>
account_id = <retrieve-account-id>
client_id = <retrieve-client-id>
client_secret = <retrieve-client-secret>
}
provider "databricks" {
alias = "workspace"
}
針對直接組態 (將 retrieve
預留位置取代為您自己的實作,以從主控台或某些其他設定存放區 (例如 HashiCorp Vault) 擷取值。另請參閱 Vault 提供者)。 在此情況下,主機是 Azure Databricks 個別工作區網址,例如 https://adb-1234567890123456.7.azuredatabricks.net
:
provider "databricks" {
alias = "workspace"
host = <retrieve-workspace-url>
client_id = <retrieve-client-id>
client_secret = <retrieve-client-secret>
}
如需有關使用 Databricks Terraform 提供者進行驗證的詳細資訊,請參閱驗證。
Python
from databricks.sdk import AccountClient
a = AccountClient()
# ...
對於直接組態,使用下列內容,將 retrieve
預留位置取代為您自己的實作,以從主控台或其他組態存放區 (例如 Azure KeyVault) 擷取值。 在此情況下,Azure Databricks 帳戶主控台網址為 https://accounts.azuredatabricks.net
:
from databricks.sdk import AccountClient
a = AccountClient(
host = retrieve_account_console_url(),
account_id = retrieve_account_id(),
client_id = retrieve_client_id(),
client_secret = retrieve_client_secret()
)
# ...
from databricks.sdk import WorkspaceClient
w = WorkspaceClient()
# ...
對於直接組態,將 retrieve
預留位置取代為您自己的實作,以從主控台或其他組態存放區 (例如 Azure KeyVault) 擷取值。 在此情況下,主機是 Azure Databricks 個別工作區網址,例如 https://adb-1234567890123456.7.azuredatabricks.net
:
from databricks.sdk import WorkspaceClient
w = WorkspaceClient(
host = retrieve_workspace_url(),
client_id = retrieve_client_id(),
client_secret = retrieve_client_secret()
)
# ...
如需有關透過使用 Python 並實作 Databricks 用戶端統一驗證的 Databricks 工具和 SDK 進行驗證的詳細資訊,請參閱:
注意
適用於 Visual Studio Code 的 Databricks 延伸項目使用 Python,但尚未實作 OAuth M2M 驗證。
Java
import com.databricks.sdk.WorkspaceClient;
// ...
WorkspaceClient w = new WorkspaceClient();
// ...
對於直接組態,將 retrieve
預留位置取代為您自己的實作,以從主控台或其他組態存放區 (例如 Azure KeyVault) 擷取值。 在此情況下,主機是 Azure Databricks 個別工作區網址,例如 https://adb-1234567890123456.7.azuredatabricks.net
:
import com.databricks.sdk.WorkspaceClient;
import com.databricks.sdk.core.DatabricksConfig;
// ...
DatabricksConfig cfg = new DatabricksConfig()
.setHost(retrieveWorkspaceUrl())
.setClientId(retrieveClientId())
.setClientSecret(retrieveClientSecret());
WorkspaceClient w = new WorkspaceClient(cfg);
// ...
如需有關透過使用 Java 並實作 Databricks 用戶端統一驗證的 Databricks 工具和 SDK 進行驗證的詳細資訊,請參閱:
- 設定適用於 Scala 的 Databricks Connect 用戶端 (適用於 Scala 的 Databricks Connect 用戶端會使用內含的適用於 JAVA 的 Databricks SDK 進行驗證)
- 使用 Azure Databricks 帳戶或工作區來驗證適用於 JAVA 的 Databricks SDK
Go
import (
"github.com/databricks/databricks-sdk-go"
)
// ...
w := databricks.Must(databricks.NewWorkspaceClient())
// ...
對於直接組態,將 retrieve
預留位置取代為您自己的實作,以從主控台或其他組態存放區 (例如 Azure KeyVault) 擷取值。 在此情況下,Azure Databricks 帳戶主控台網址為 https://accounts.azuredatabricks.net
:
import (
"github.com/databricks/databricks-sdk-go"
)
// ...
w := databricks.Must(databricks.NewWorkspaceClient(&databricks.Config{
Host: retrieveAccountConsoleUrl(),
AccountId: retrieveAccountId(),
ClientId: retrieveClientId(),
ClientSecret: retrieveClientSecret(),
}))
// ...
import (
"github.com/databricks/databricks-sdk-go"
)
// ...
a := databricks.Must(databricks.NewAccountClient())
// ...
對於直接組態,將 retrieve
預留位置取代為您自己的實作,以從主控台或其他組態存放區 (例如 Azure KeyVault) 擷取值。 在此情況下,主機是 Azure Databricks 個別工作區網址,例如 https://adb-1234567890123456.7.azuredatabricks.net
:
import (
"github.com/databricks/databricks-sdk-go"
)
// ...
a := databricks.Must(databricks.NewAccountClient(&databricks.Config{
Host: retrieveWorkspaceUrl(),
ClientId: retrieveClientId(),
ClientSecret: retrieveClientSecret(),
}))
// ...
如需使用 Go 和實作 Databricks 用戶端統一驗證的 Databricks 工具和 SDK 進行驗證的詳細資訊,請參閱使用 Azure Databricks 帳戶或工作區驗證適用於 Go 的 Databricks SDK。
手動產生和使用 OAuth M2M 驗證的存取權杖
實作 Databricks 用戶端統一驗證標準的 Azure Databricks 工具和 SDK 將根據 OAuth M2M 驗證的需要,代表您自動產生、重新整理和使用 Azure Databricks OAuth 存取權杖。
不過,如果您必須手動產生、重新整理或使用 Azure Databricks OAuth 存取令牌,請遵循本節中的指示,使用 Databricks 建議使用用戶端整合驗證。
使用服務主體的用戶端標識碼和 OAuth 秘密,要求 OAuth 存取令牌向帳戶層級 REST API 和工作區層級 REST API 進行驗證。 存取令牌將在一小時內到期。 您必須在到期后要求新的 OAuth 存取令牌。 OAuth 存取權杖的範圍取決於您從中建立權杖的層級。 您可以在帳戶層級或工作區層級建立權杖,如下所示:
- 若要在服務主體可存取的帳戶和工作區內呼叫帳戶層級和工作區層級 REST API, 請在帳戶層級手動產生存取令牌。
- 若要在服務主體可存取的其中一個工作區內呼叫 REST API, 請僅針對該工作區在工作區層級 手動產生存取令牌。
手動產生帳戶層級存取權杖
從帳戶層級建立的 OAuth 存取令牌可以用於帳戶中的 Databricks REST API,以及服務主體可存取的任何工作區。
身為帳戶管理員,登入帳戶主機。
按一下右上角使用者名稱旁邊的向下箭頭。
複製您的帳戶識別碼。
透過將下列 URL 中的
<my-account-id>
取代為您複製的帳戶識別碼,來建構權杖端點 URL。https://accounts.azuredatabricks.net/oidc/accounts/<my-account-id>/v1/token
使用用戶端,例如
curl
,使用令牌端點 URL 要求 OAuth 存取令牌、服務主體的用戶端識別碼(也稱為應用程式識別符),以及您建立的服務主體 OAuth 秘密。all-apis
範圍會要求 OAuth 存取令牌,此令牌可用來存取服務主體已授與存取權的所有 Databricks REST API。- 將
<token-endpoint-URL>
取代為上述權杖端點 URL。 - 將
<client-id>
取代為服務主體的用戶端 ID,也稱為應用程式 ID。 - 將
<client-secret>
取代為您建立的服務主體 OAuth 祕密。
export CLIENT_ID=<client-id> export CLIENT_SECRET=<client-secret> curl --request POST \ --url <token-endpoint-URL> \ --user "$CLIENT_ID:$CLIENT_SECRET" \ --data 'grant_type=client_credentials&scope=all-apis'
這會產生類似於下例的回應:
{ "access_token": "eyJraWQiOiJkYTA4ZTVjZ…", "token_type": "Bearer", "expires_in": 3600 }
從回應中複製
access_token
。- 將
手動產生工作區層級存取權杖
從工作區層級建立的 OAuth 存取令牌只能存取該工作區中的 REST API,即使服務主體是帳戶管理員或屬於其他工作區的成員也一樣。
透過將
https://<databricks-instance>
取代為您的 Azure Databricks 部署的工作區 URL 來建構權杖端點 URL:https://<databricks-instance>/oidc/v1/token
使用用戶端,例如
curl
,使用令牌端點 URL 要求 OAuth 存取令牌、服務主體的用戶端識別碼(也稱為應用程式識別符),以及您建立的服務主體 OAuth 秘密。all-apis
範圍會要求 OAuth 存取令牌,此令牌可用來存取您要求令牌之工作區內服務主體已授與存取權的所有 Databricks REST API。- 將
<token-endpoint-URL>
取代為上述權杖端點 URL。 - 將
<client-id>
取代為服務主體的用戶端 ID,也稱為應用程式 ID。 - 將
<client-secret>
取代為您建立的服務主體 OAuth 祕密。
export CLIENT_ID=<client-id> export CLIENT_SECRET=<client-secret> curl --request POST \ --url <token-endpoint-URL> \ --user "$CLIENT_ID:$CLIENT_SECRET" \ --data 'grant_type=client_credentials&scope=all-apis'
這會產生類似於下例的回應:
{ "access_token": "eyJraWQiOiJkYTA4ZTVjZ…", "token_type": "Bearer", "expires_in": 3600 }
從回應中複製
access_token
。- 將
呼叫 Databricks REST API
您現在可以使用 OAuth 存取令牌向 Azure Databricks 帳戶層級 REST API 和 工作區層級 REST API 進行驗證。 服務主體必須是帳戶管理員,才能呼叫帳戶層級 REST API。
您可以使用 Bearer
驗證將權杖包含在標頭中。 也可將此方法用於 curl
或您組建的任何用戶端。
範例帳戶層級 REST API 要求
此範例使用 Bearer
驗證來取得與帳戶關聯的所有工作區清單。
- 將 取代
<oauth-access-token>
為您在上一個步驟中複製的服務主體 OAuth 存取令牌。 - 將
<account-id>
取代為您的帳戶識別碼。
export OAUTH_TOKEN=<oauth-access-token>
curl --request GET --header "Authorization: Bearer $OAUTH_TOKEN" \
'https://accounts.azuredatabricks.net/api/2.0/accounts/<account-id>/workspaces'
範例工作區層級 REST API 要求
此範例使用 Bearer
驗證來列出指定工作區中的所有可用叢集。
- 將 取代
<oauth-access-token>
為您在上一個步驟中複製的服務主體 OAuth 存取令牌。 - 將
<workspace-URL>
取代為您的基本工作區 URL,其格式類似於dbc-a1b2345c-d6e7.cloud.databricks.com
。
export OAUTH_TOKEN=<oauth-access-token>
curl --request GET --header "Authorization: Bearer $OAUTH_TOKEN" \
'https://<workspace-URL>/api/2.0/clusters/list'
其他資源
- 服務主體
- Databricks 身分識別模型概觀
- 有關驗證和存取控制的其他資訊