使用 OAuth (OAuth M2M) 通过服务主体对 Azure Databricks 的访问进行身份验证
本文介绍如何创建 Azure Databricks 服务主体,并使用它或 Microsoft Entra ID 托管服务主体向目标实体进行身份验证。
注意
必须是 Azure Databricks 帐户管理员才能管理服务主体的 Azure Databricks OAuth 凭据。
步骤 1:在 Azure 帐户中创建 Microsoft Entra ID 服务主体
如果要将 Microsoft Entra ID 服务主体链接到 Azure Databricks 帐户、工作区或帐户和工作区,请完成此步骤。 否则,请跳到步骤 2。
登录到 Azure 门户。
注意
要使用的门户根据 Microsoft Entra ID 应用程序是在 Azure 公有云中运行还是在国家云或主权云中运行而异。 有关详细信息,请参阅国家云。
如果有权访问多个租户、订阅或目录,请单击顶部菜单中的“目录 + 订阅”(目录包含筛选器)图标,以切换到要预配服务主体的目录。
在“搜索资源、服务和文档”中,搜索并选择“Microsoft Entra ID”。
单击“+ 添加”,然后选择“应用注册”。
对于“名称”,请输入应用程序的名称。
在“支持的帐户类型”部分中,选择“仅组织目录中的帐户(单一租户)”。
单击“注册”。
在应用程序页的“概述”页上的“概要”部分中,复制以下值:
- 应用程序(客户端) ID
- 目录(租户)ID
若要生成客户端密码,请在“管理”中单击“证书和机密”。
注意
使用此客户端密码生成 Microsoft Entra ID 令牌,以使用 Azure Databricks 对 Microsoft Entra ID 服务主体进行身份验证。 若要确定 Azure Databricks 工具或 SDK 是否可以使用 Microsoft Entra ID 令牌,请参阅此工具或 SDK 的文档。
在“客户端密码”选项卡上,单击“新建客户端密码” 。
在“添加客户端机密”窗格中的“说明”,输入客户端机密的说明。
对于“过期”,选择客户端机密的过期时间段,然后单击“添加”。
复制客户端密码的“值”并将其存储在安全位置,因为此客户端密码是应用程序的密码。
步骤 2:将服务主体添加到 Azure Databricks 帐户
仅当目标 Azure Databricks 工作区启用了联合身份验证时,此步骤才有效。 如果工作区未启用联合身份验证,请跳到步骤 3。
在 Azure Databricks 工作区中,单击顶部栏中的用户名,然后选择“管理帐户”。
或者,直接转到 Azure Databricks 帐户控制台 (https://accounts.databricks.azure.cn)。
根据提示登录到你的 Azure Databricks 帐户。
在边栏上,单击“用户管理”。
单击“服务主体”选项卡。
单击“添加服务主体”。
在“管理”下,选择“Databricks 管理”或“Microsoft Entra ID 管理”。
如果选择了“Microsoft Entra ID 管理”,请在“Microsoft Entra 应用程序 ID”下粘贴步骤 1 的应用程序(客户端)ID 值。
为服务主体输入名称。
单击“添加” 。
(可选)向服务主体分配帐户级权限:
- 在“服务主体”选项卡上,单击服务主体的名称。
- 在“角色”选项卡上,按切换开关以启用或禁用你希望此服务主体具有的每个目标角色。
- 在“权限”选项卡上,对你想要其管理和使用此服务主体的任何 Azure Databricks 用户、服务主体和帐户组角色授予访问权限。 请参阅管理服务主体上的角色。
步骤 3:将服务主体添加到 Azure Databricks 工作区
如果工作区已启用联合身份验证:
- 在 Azure Databricks 工作区中,单击顶部栏中的用户名,然后单击“设置”。
- 单击“身份验证和访问控制”选项卡。
- 单击“服务主体”旁的“管理”。
- 单击“添加服务主体”。
- 从步骤 2 中选择服务主体,然后单击“添加”。
跳转到步骤 4。
如果工作区未启用联合身份验证:
- 在 Azure Databricks 工作区中,单击顶部栏中的用户名,然后单击“设置”。
- 单击“身份验证和访问控制”选项卡。
- 单击“服务主体”旁的“管理”。
- 单击“添加服务主体”。
- 单击“新增” 。
- 在“管理”下,选择“Databricks 管理”或“Microsoft Entra ID 管理”。
- 如果选择了“Microsoft Entra ID 管理”,请在“Microsoft Entra 应用程序 ID”下粘贴步骤 1 的应用程序(客户端)ID 值。
- 输入新服务主体的一些显示名称,然后单击“添加”。
步骤 4:向服务主体分配工作区级权限
- 如果工作区的管理控制台尚未打开,请单击顶部栏中的用户名,然后单击“设置”。
- 单击“身份验证和访问控制”选项卡。
- 单击“服务主体”旁的“管理”。
- 单击服务主体的名称以打开其设置页。
- 在“配置”选项卡上,勾选你希望服务主体在此工作区拥有的每项权利旁边的框,然后单击“更新”。
- 在“权限”选项卡上,对你想要其管理和使用此服务主体的任何 Azure Databricks 用户、服务主体和组授予访问权限。 请参阅管理服务主体上的角色。
步骤 5:为服务主体创建 Azure Databricks OAuth 机密
必须先创建可用于生成 OAuth 访问令牌的 OAuth 机密,然后才能使用 OAuth 向 Azure Databricks 进行身份验证。 服务主体最多可以有五个 OAuth 机密。
若要从帐户控制台为服务主体创建 OAuth 机密,请执行以下操作:
- 登录到位于 https://accounts.databricks.azure.cn 的 Azure Databricks 帐户控制台。
- 根据提示登录到你的 Azure Databricks 帐户。
- 在边栏上,单击“用户管理”。
- 单击“服务主体”选项卡。
- 单击服务主体的名称。
- 在主体信息选项卡的 OAuth 机密部分中,单击生成机密。
- 在“生成机密”对话框中,复制“机密”值并将其存储在安全的位置,因为此 OAuth 机密是服务主体的密码。
- 单击“完成” 。
若要从工作区为服务主体创建 OAuth 机密,请执行以下操作:
作为工作区管理员,单击顶部栏中的用户名,然后选择“设置”。
单击“身份验证和访问控制”选项卡。
单击“服务主体”旁的“管理”。
单击服务主体的名称以打开其设置页。
单击“机密”选项卡。
在 OAuth 机密下,单击“生成机密”。
复制显示的“机密”和“客户端 ID”,然后单击“完成”。
机密在创建过程中只显示一次。 客户端 ID 与服务主体的应用程序 ID 相同。
完成 OAuth M2M 身份验证配置
若要完成 OAuth M2M 身份验证的配置,必须设置以下关联的环境变量、.databrickscfg
字段、Terraform 字段或 Config
字段:
- Azure Databricks 主机,指定为
https://accounts.databricks.azure.cn
(对于帐户操作)或指定为目标每工作区 URL,例如https://adb-1234567890123456.7.databricks.azure.cn
(对于工作区操作)。 - Azure Databricks 帐户 ID(对于 Azure Databricks 帐户操作)。
- 服务主体客户端 ID。
- 服务主体机密。
若要执行 OAuth M2M 身份验证,请根据相关的工具或 SDK 在代码中集成以下内容:
环境
若要通过工具或 SDK 对特定 Azure Databricks 身份验证类型使用环境变量,请参阅对 Azure Databricks 资源的访问进行身份验证,或该工具或 SDK 的相关文档。 另请参阅客户端统一身份验证的环境变量和字段和客户端统一身份验证的默认方法。
对于帐户级操作,请设置以下环境变量:
DATABRICKS_HOST
,设置为 Azure Databricks 帐户控制台 URL,https://accounts.databricks.azure.cn
。DATABRICKS_ACCOUNT_ID
DATABRICKS_CLIENT_ID
DATABRICKS_CLIENT_SECRET
对于工作区级操作,请设置以下环境变量:
DATABRICKS_HOST
,设置为 Azure Databricks 每工作区 URL,例如https://adb-1234567890123456.7.databricks.azure.cn
。DATABRICKS_CLIENT_ID
DATABRICKS_CLIENT_SECRET
配置文件
在 .databrickscfg
文件中使用以下字段创建或标识 Azure Databricks 配置文件。 如果创建配置文件,请将占位符替换为相应值。 若要通过工具或 SDK 使用配置文件,请参阅对 Azure Databricks 资源的访问进行身份验证,或该工具或 SDK 的相关文档。 另请参阅客户端统一身份验证的环境变量和字段和客户端统一身份验证的默认方法。
对于帐户级操作,请在 .databrickscfg
文件中设置以下值。 在本例中,Azure Databricks 帐户控制台 URL 为 https://accounts.databricks.azure.cn
:
[<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 每工作区 URL,例如 https://adb-1234567890123456.7.databricks.azure.cn
:
[<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 Connect for Databricks Runtime 13.3 LTS 及更高版本。 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
环境变量设置为每工作区 URL,例如https://adb-1234567890123456.7.databricks.azure.cn
。 - 按照本文“环境”部分所述为 Azure Databricks 工作区级别操作设置环境变量。 此外,将
DATABRICKS_CLUSTER_ID
环境变量设置为每工作区 URL,例如https://adb-1234567890123456.7.databricks.azure.cn
。
.databrickscfg
文件中的值始终优先于环境变量。
若要使用 .databrickscfg
文件中的以下环境变量或值初始化 Databricks Connect 客户端,请参阅以内容之一:
- 对于 Python,请参阅《配置 Python 的连接属性》。
- 对于 Scala,请参阅《配置 Scala 的连接属性》。
VS Code
对于适用于 Visual Studio Code 的 Databricks 扩展,请执行以下操作:
- 按照本文“配置文件”部分所述为 Azure Databricks 工作区级别操作设置
.databrickscfg
文件中的值。 - 在 Visual Studio Code 的 Databricks 扩展中,单击“配置”窗格中的“配置 Databricks”。
- 在“命令面板”中,对于“Databricks 主机”,请输入每工作区 URL,例如
https://adb-1234567890123456.7.databricks.azure.cn
,然后按Enter
。 - 在命令面板中,在 URL 列表中选择目标配置文件的名称。
有关详细信息,请参阅 Visual Studio Code 的 Databricks 扩展的身份验证设置。
Terraform
provider "databricks" {
alias = "accounts"
}
对于直接配置(将 retrieve
占位符替换为你自己的实现,以从控制台或 HashiCorp Vault 等其他某个配置存储检索值)。另请参阅保管库提供程序)。 在本例中,Azure Databricks 帐户控制台 URL 为 https://accounts.databricks.azure.cn
:
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 等其他某个配置存储检索值)。另请参阅保管库提供程序)。 在本例中,主机是 Azure Databricks 每工作区 URL,例如 https://adb-1234567890123456.7.databricks.azure.cn
:
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 帐户控制台 URL 为 https://accounts.databricks.azure.cn
:
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 每工作区 URL,例如 https://adb-1234567890123456.7.databricks.azure.cn
:
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 每工作区 URL,例如 https://adb-1234567890123456.7.databricks.azure.cn
:
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 客户端使用随附的 Databricks SDK for Java 进行身份验证)
- 使用 Azure Databricks 帐户或工作区对 Databricks SDK for Java 进行身份验证
Go
import (
"github.com/databricks/databricks-sdk-go"
)
// ...
w := databricks.Must(databricks.NewWorkspaceClient())
// ...
对于直接配置(将 retrieve
占位符替换为你自己的实现,以从控制台或 Azure KeyVault 等其他配置存储区检索值)。 在本例中,Azure Databricks 帐户控制台 URL 为 https://accounts.databricks.azure.cn
:
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 每工作区 URL,例如 https://adb-1234567890123456.7.databricks.azure.cn
:
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 帐户或工作区对 Databricks SDK for Go 进行身份验证。
手动生成和使用 OAuth M2M 身份验证的访问令牌
实现 Databricks 客户端统一身份验证标准的 Azure Databricks 工具和 SDK 将根据 OAuth M2M 身份验证的需要,代表你自动生成、刷新和使用 Azure Databricks OAuth 访问令牌。
如果必须手动生成、刷新或使用 Azure Databricks OAuth 访问令牌进行 OAuth M2M 身份验证,请按照本部分中的说明进行操作。
步骤 1:创建服务主体和 OAuth 机密
如果尚无 Azure Databricks 托管服务主体或 Microsoft Entra ID 托管服务主体及其相应的 Azure Databricks OAuth 机密,请通过完成本文开头的步骤 1-5 来创建它们。
步骤 2:手动生成访问令牌
使用 Azure Databricks 托管服务主体或 Microsoft Entra ID 托管服务主体的客户端 ID 和 Azure Databricks OAuth 机密来请求 Azure Databricks OAuth 访问令牌,以向帐户级别 REST API 和工作区级别 REST API 进行身份验证。 令牌将在一小时后过期。 必须在过期后请求新的 Azure Databricks OAuth 访问令牌。 OAuth 访问令牌的范围取决于你创建令牌处的级别。 可在帐户级别或工作区级别创建令牌,如下所示:
- 若要在 Azure Databricks 托管服务主体或 Microsoft Entra ID 托管服务主体有权访问的帐户和工作区中调用帐户级和工作区级 REST API,请在帐户级手动生成访问令牌。
- 若要仅在 Azure Databricks 托管服务主体或 Microsoft Entra ID 托管服务主体有权访问的一个工作区中调用 REST API,可仅为该工作区在工作区级手动生成访问令牌。
手动生成帐户级访问令牌
从帐户级别创建的 Azure Databricks OAuth 访问令牌可用于帐户中的 Databricks REST API 以及 Azure Databricks 托管服务主体或 Microsoft Entra ID 托管服务主体被分配到的任何工作区中的 Databricks API。
作为帐户管理员,登录到帐户控制台。
单击右上角用户名旁边的向下箭头。
复制你的帐户 ID。
通过将以下 URL 中的
<my-account-id>
替换为你复制的帐户 ID 来构造令牌终结点 URL。https://accounts.databricks.azure.cn/oidc/accounts/<my-account-id>/v1/token
使用
curl
等客户端通过令牌终结点 URL、Azure Databricks 托管服务主体或 Microsoft Entra ID 托管服务主体的客户端 ID(也称为应用程序 ID),以及为 Azure Databricks 托管服务主体或 Microsoft Entra ID 托管服务主体创建的 Azure Databricks OAuth 机密,请求 Azure Databricks OAuth 访问令牌。all-apis
范围会请求一个 Azure Databricks OAuth 访问令牌,该访问令牌可用于访问 Azure Databricks 托管服务主体或 Microsoft Entra ID 托管服务主体被授予访问权限的所有 Databricks REST API。- 将
<token-endpoint-URL>
替换为上面的令牌终结点 URL。 - 将
<client-id>
替换为 Azure Databricks 托管服务主体或 Microsoft Entra ID 托管服务主体的客户端 ID,它也被称为应用程序 ID。 - 将
<client-secret>
替换为你为 Azure Databricks 托管服务主体或 Microsoft Entra ID 托管服务主体创建的 Azure Databricks 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…", "scope": "all-apis", "token_type": "Bearer", "expires_in": 3600 }
从响应复制
access_token
。Azure Databricks OAuth 访问令牌将在一小时后过期。 必须在过期后手动生成新的 Azure Databricks OAuth 访问令牌。
- 将
手动生成工作区级访问令牌
从工作区级别创建的 Azure Databricks OAuth 访问令牌只能访问该工作区中的 REST API,即使 Azure Databricks 托管服务主体或 Microsoft Entra ID 托管服务主体是帐户管理员或其他工作区的成员也是如此。
通过将
https://<databricks-instance>
替换为你的 Azure Databricks 部署的工作区 URL 来构造令牌终结点 URL:https://<databricks-instance>/oidc/v1/token
使用
curl
等客户端通过令牌终结点 URL、Azure Databricks 托管服务主体或 Microsoft Entra ID 托管服务主体的客户端 ID(也称为应用程序 ID),以及为 Azure Databricks 托管服务主体或 Microsoft Entra ID 托管服务主体创建的 Azure Databricks OAuth 机密,请求 Azure Databricks OAuth 访问令牌。all-apis
范围会请求一个 Azure Databricks OAuth 访问令牌,该访问令牌可用于访问在你请求令牌的工作区内且 Azure Databricks 托管服务主体或 Microsoft Entra ID 托管服务主体被授予访问权限的所有 Databricks REST API。将
<token-endpoint-URL>
替换为上面的令牌终结点 URL。将
<client-id>
替换为 Azure Databricks 托管服务主体或 Microsoft Entra ID 托管服务主体的客户端 ID,它也被称为应用程序 ID。将
<client-secret>
替换为你为 Azure Databricks 托管服务主体或 Microsoft Entra ID 托管服务主体创建的 Azure Databricks 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…", "scope": "all-apis", "token_type": "Bearer", "expires_in": 3600 }
从响应复制
access_token
。
步骤 3:调用 Databricks REST API
现在可以使用 Azure Databricks OAuth 访问令牌向 Azure Databricks 帐户级别 REST API 和工作区级别 REST API 进行身份验证。 Azure Databricks 托管服务主体或 Microsoft Entra ID 托管服务主体必须是帐户管理员,才能调用帐户级 REST API。
可使用 Bearer
身份验证将令牌包含在标头中, 也可将此方法用于 curl
或你构建的任何客户端。
帐户级 REST API 请求示例
此示例使用 Bearer
身份验证来获取与帐户关联的所有工作区的列表。
- 将
<oauth-access-token>
替换为 Azure Databricks 托管服务主体或 Microsoft Entra ID 托管服务主体的 Azure Databricks OAuth 访问令牌。 - 将
<account-id>
替换为你的帐户 ID。
export OAUTH_TOKEN=<oauth-access-token>
curl --request GET --header "Authorization: Bearer $OAUTH_TOKEN" \
'https://accounts.databricks.azure.cn/api/2.0/accounts/<account-id>/workspaces'
工作区级 REST API 请求示例
此示例使用 Bearer
身份验证列出指定工作区中的所有可用群集。
将
<oauth-access-token>
替换为 Azure Databricks 托管服务主体或 Microsoft Entra ID 托管服务主体的 Azure Databricks OAuth 访问令牌。将
<workspace-URL>
替换为你的基本工作区 URL,其格式类似于adb-1111111111111111.1.databricks.azure.cn
。export OAUTH_TOKEN=<oauth-access-token> curl --request GET --header "Authorization: Bearer $OAUTH_TOKEN" \ 'https://<workspace-URL>/api/2.0/clusters/list'
其他资源
- 服务主体
- Databricks 标识模型概述
- 有关身份验证和访问控制的其他信息