使用服务主体获取 Azure Active Directory 令牌

本文介绍在 Azure Active Directory (Azure AD) 中定义的服务主体如何还可以充当在 Azure Databricks 中强制执行身份验证和授权策略的主体。 Azure Databricks 工作区中的服务主体可以有不同于常规用户(用户主体)的精细访问控制。

服务主体充当客户端角色,并使用OAuth 2.0 代码授予流来授权 Azure Databricks 资源。

可以使用 Databricks SCIM api 2.0 (服务主体) api 管理服务主体,也可以在 Azure 门户中使用以下过程。

还可以使用 Azure Active Directory 身份验证库 (ADAL) 以编程方式为用户获取 Azure AD 访问令牌。 请参阅使用 Azure Active Directory 身份验证库获取 Azure Active Directory 令牌

在 Azure 门户中预配服务主体

  1. 登录到 Azure 门户。

  2. 导航到Azure Active Directory 应用注册 > 新注册。 应会显示如下所示的屏幕:

    注册应用

  3. 单击 " 证书 机密 " 并生成新的客户端密钥。

    新的客户端密码

  4. 复制此密码并将其存储在安全位置,因为此密码是应用程序的密码。

  5. 单击“概述”,以查看应用程序(客户端)ID 和目录(租户)ID 等详细信息。

使用应用标识访问资源介绍如何在 Azure AD 中预配应用程序(服务主体)。

获取 Azure Active Directory 访问令牌

如果要使用服务主体访问 Databricks REST API,需要获取服务主体的 Azure AD 访问令牌。 可以使用 客户端凭据流 获取访问令牌,并使用 AzureDatabricks 登录应用程序作为资源。

curl 请求中,替换以下参数:

参数 说明
租户 ID Azure AD 中的租户 ID。 请参阅Azure Active Directory Properties > Directory ID
客户端 ID Azure 门户预配服务主体中注册的应用程序的应用程序(服务主体)ID。
应用程序密码 为应用程序生成的机密。

resource参数是 AzureDatabricks 登录应用程序的标识符。 此标识符是设置为的常量值 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d

curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \
-d 'grant_type=client_credentials&client_id=<client-id>&resource=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d&client_secret=<application-secret>' \
https://login.microsoftonline.com/<tenant-id>/oauth2/token

响应应如下所示:

{
  "token_type": "Bearer",
  "expires_in": "599",
  "ext_expires_in": "599",
  "expires_on": "1575500666",
  "not_before": "1575499766",
  "resource": "2ff8...f879c1d",
  "access_token": "ABC0eXAiOiJKV1Q......un_f1mSgCHlA"
}

access_token响应中的是 Azure ADaccess_token

使用服务主体的 Azure AD 访问令牌访问 Databricks REST API

在以下示例中,请将替换 <databricks-instance> 为 Azure Databricks 部署的 <databricks-instance>

对作为 Azure Databricks 工作区用户和管理员的服务主体的 API 访问

注意

在此登录之前,必须将服务主体作为对非工作区用户的服务主体的 API 访问工作流的一部分添加到工作区,或使用添加服务主体终结点。

使用访问令牌作为 Bearer 令牌。

参数 描述
访问令牌 获取 Azure Active Directory 访问令牌中的请求返回的令牌。

示例

curl -X GET \
-H 'Authorization: Bearer <access-token>' \
https://<databricks-instance>/api/2.0/clusters/list

对非工作区用户的服务主体的 API 访问

如果存在以下情况,请使用本部分中所述的身份验证过程:

  • 服务主体在 Azure Databricks 工作区中未定义为用户(无论是否是管理员)。
  • 服务主体属于工作区,但你希望以管理员用户身份进行自动添加。

否则,请参阅对作为 Azure Databricks 工作区用户和管理员的服务主体的 API 访问

要求

以非工作区用户身份登录:

  • 服务主体必须对 Azure 中的工作区资源具有“参与者”或“所有者”角色。
  • 必须提供 X-Databricks-Azure-Workspace-Resource-Id 标头,该标头包含 Azure 中工作区资源的 ID。 使用 Azure 订阅 ID、资源组名称以及工作区资源名称构造 ID。
  • 必须提供 Azure 资源管理终结点的管理访问令牌。

获取 Azure 管理资源终结点令牌

curl 请求中,替换以下参数:

参数 说明
租户 ID Azure AD 中的租户 ID。 请参阅Azure Active Directory Properties > Directory ID
客户端 ID Azure 门户预配服务主体中注册的应用程序的应用程序(服务主体)ID。
管理资源终结点 https://management.core.windows.net/.
应用程序密码 为应用程序生成的机密。
curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \
-d 'grant_type=client_credentials&client_id=<client-id>&resource=<management-resource-endpoint>&client_secret=<application-secret>' \
https://login.microsoftonline.com/<tenantid>/oauth2/token

示例响应:

{
  "token_type": "Bearer",
  "expires_in": "599",
  "ext_expires_in": "599",
  "expires_on": "1575500666",
  "not_before": "1575499766",
  "resource": "https://management.core.windows.net/",
  "access_token": "LMN0eXAiOiJKV1Q......un_f1mSgCHlA"
}

access_token响应中的是access_token

使用管理终结点访问令牌访问 Databricks REST API

参数 描述
访问令牌 获取 Azure Active Directory 访问令牌中获取的访问令牌。
管理访问令牌 获取 Azure 管理资源终结点令牌中获取的管理终结点访问令牌。
订阅 ID Azure Databricks 资源的订阅 ID。
资源组名称 Azure Databricks 资源组的名称。
工作区名称 Azure Databricks 工作区的名称。
curl -X GET \
-H 'Authorization: Bearer <access-token>' \
-H 'X-Databricks-Azure-SP-Management-Token: <management-access-token>' \
-H 'X-Databricks-Azure-Workspace-Resource-Id: /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Databricks/workspaces/<workspace-name>' \
https://<databricks-instance>/api/2.0/clusters/list

示例请求:

curl -X GET \
-H 'Authorization:Bearer ABC0eXAiOiJKV1Q......un_f1mSgCHlA' \
-H 'X-Databricks-Azure-SP-Management-Token: LMN0eXAiOiJKV1Q......un_f1mSgCHlA' \
-H 'X-Databricks-Azure-Workspace-Resource-Id: /subscriptions/3f2e4d...2328b/resourceGroups/Ene...RG/providers/Microsoft.Databricks/workspaces/demo-databricks' \
https://<databricks-instance>/api/2.0/clusters/list