使用 OAuth (OAuth M2M) 通过服务主体对 Azure Databricks 的访问进行身份验证

本文介绍如何创建 Azure Databricks 服务主体,并使用它通过 OAuth 对目标实体进行身份验证。

步骤 1:创建服务主体

帐户管理员和工作区管理员可以创建服务主体。 此步骤描述在工作区中创建服务主体。 要使用帐户控制台,请参阅管理帐户中的服务主体

还可以创建 Microsoft Entra ID 托管的服务主体并将其添加到 Azure Databricks。 有关详细信息,请参阅 Databricks 和 Microsoft Entra ID 服务主体

  1. 以工作区管理员身份登录到 Azure Databricks 工作区。
  2. 单击 Azure Databricks 工作区顶部栏中的用户名,然后选择“设置”
  3. 单击“身份验证和访问控制”选项卡。
  4. 单击“服务主体”旁的“管理”。
  5. 单击“添加服务主体”。
  6. 请单击搜索框中的下拉箭头,然后单击新增
  7. 选择管理项下的 Databricks 托管
  8. 为服务主体输入名称。
  9. 单击“添加” 。

可将服务主体添加到工作区和 Azure Databricks 帐户。

步骤 2:向服务主体分配权限。

  1. 单击服务主体的名称,以打开其详细信息页。
  2. 在“配置”选项卡上,勾选你希望服务主体在此工作区拥有的每项权利旁边的框,然后单击“更新”。
  3. 在“权限”选项卡上,对你想要其管理和使用此服务主体的任何 Azure Databricks 用户、服务主体和组授予访问权限。 请参阅管理服务主体上的角色

步骤 3:创建服务主体的 OAuth 机密

必须先创建可用于生成 OAuth 访问令牌的 OAuth 机密,然后才能使用 OAuth 向 Azure Databricks 进行身份验证。 服务主体最多可以有五个 OAuth 机密。 帐户管理员和工作区管理员可以创建服务主体的 OAuth 机密。

  1. 在服务主体的详细信息页上,单击“机密”选项卡。

  2. 在 OAuth 机密下,单击“生成机密”

    从工作区生成 OAuth 机密

  3. 复制显示的“机密”和“客户端 ID”,然后单击“完成”。

机密在创建过程中只显示一次。 客户端 ID 与服务主体的应用程序 ID 相同。

帐户管理员还可以从帐户控制台中的服务主体详细信息页生成 OAuth 机密。

  1. 作为帐户管理员,登录到帐户控制台

  2. 单击“帐户控制台用户管理图标 用户管理”

  3. 在“服务主体”选项卡上,选择服务主体。

  4. 在 OAuth 机密下,单击“生成机密”

    从工作区生成 OAuth 机密

  5. 复制显示的“机密”和“客户端 ID”,然后单击“完成”。

注意

若要使服务主体能够使用群集或 SQL 仓库,必须向其授予服务主体访问权限。 请参阅计算权限管理 SQL 仓库

步骤 4:使用 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 客户端,请参阅适用于 Databricks Connect 的计算配置

VS Code

对于适用于 Visual Studio Code 的 Databricks 扩展,请执行以下操作:

  1. 按照本文“配置文件”部分所述为 Azure Databricks 工作区级别操作设置 .databrickscfg 文件中的值。
  2. 在 Visual Studio Code 的 Databricks 扩展中,单击“配置”窗格中的“配置 Databricks”。
  3. 在“命令面板”中,对于“Databricks 主机”,请输入每工作区 URL,例如 https://adb-1234567890123456.7.databricks.azure.cn,然后按 Enter
  4. 在命令面板中,在 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 进行身份验证的详细信息,请参阅:

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 访问令牌。

Databricks 建议使用客户端统一身份验证,但如果必须手动生成、刷新或使用 Azure Databricks OAuth 访问令牌,请按照本部分中的说明进行操作。

可以使用服务主体的客户端 ID 和 OAuth 机密请求 OAuth 访问令牌,向帐户级 REST API 和工作区级 REST API 进行身份验证。 访问令牌将在一小时后过期。 必须在过期后请求新的 OAuth 访问令牌。 OAuth 访问令牌的范围取决于你创建令牌处的级别。 可在帐户级别或工作区级别创建令牌,如下所示:

手动生成帐户级访问令牌

从帐户级别创建的 OAuth 访问令牌可用于帐户中的 Databricks REST API,以及服务主体有权访问的任何工作区中。

  1. 作为帐户管理员,登录到帐户控制台

  2. 单击右上角用户名旁边的向下箭头。

  3. 复制你的帐户 ID

  4. 通过将以下 URL 中的 <my-account-id> 替换为你复制的帐户 ID 来构造令牌终结点 URL。

    https://accounts.databricks.azure.cn/oidc/accounts/<my-account-id>/v1/token
    
  5. 使用客户端(例如 curl)请求 OAuth 访问令牌,其中包含令牌端点 URL、服务主体的客户端 ID(也称为应用程序 ID)和创建的服务主体 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,即使服务主体是帐户管理员或其他工作区的成员。

  1. 通过将 https://<databricks-instance> 替换为你的 Azure Databricks 部署的工作区 URL 来构造令牌终结点 URL:

    https://<databricks-instance>/oidc/v1/token
    
  2. 使用客户端(例如 curl)请求 OAuth 访问令牌,其中包含令牌端点 URL、服务主体的客户端 ID(也称为应用程序 ID)和创建的服务主体 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> 替换为你的帐户 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> 替换为在上一步中复制的服务主体的 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'

其他资源