在 M2M 流程中读取通过 OpenID Connect(OIDC)联合身份验证共享的数据

本页介绍数据收件人如何使用自己标识提供者 (IdP) 中注册的 Python 客户端,来建立对 Databricks 中创建的 Delta Sharing 共享的访问权限。 此“计算机到计算机”(M2M) OAuth 客户端凭据授予流通常用于应用程序(例如虚拟机上运行的夜间作业)自主访问数据的情况。 此身份验证流程使用 OIDC 联合身份验证,允许接收方的 IdP 颁发的 JSON Web 令牌(JWT)作为短期 OAuth 令牌,这些令牌经过 Databricks 的身份验证。 此 Databricks 到开放共享 身份验证流程适用于无法访问启用了 Unity Catalog 的 Databricks 工作区的收件人。

开放 OIDC 联合是一种替代方法,该方法使用长期存在的 Databricks 颁发的持有者令牌,将非 Databricks 收件人连接到提供者。 在 OAuth 客户端凭据授予流中,OAuth 应用程序注册为收件人 IdP 中的服务主体(SP)。 Databricks、提供程序和收件人之间不会共享长期机密或凭据。 有关改用持有者令牌管理共享身份验证的信息,请参阅 使用持有者令牌(打开共享)为非 Databricks 用户创建收件人对象

本文适用于收件人。 有关提供方如何在 Azure Databricks 中为接收方启用 OIDC 联合的信息,请参阅 为 Delta Sharing 接收方启用 Open ID Connect (OIDC) 联合。 有关“用户到计算机”(U2M)流的信息,请参阅 U2M 流中使用 Open ID Connect (OIDC) 联合身份验证共享的数据

在 IdP 中注册应用

在使用 OIDC 联合授予客户端应用程序对 Delta Sharing 共享的访问权限之前,必须在你的 IdP 中注册 OAuth 应用程序。 本部分介绍如何在 Microsoft Entra ID 中注册 OAuth 应用程序。 有关其他 IdP,请参阅其文档。

在 Microsoft Entra ID 中注册应用

这些说明旨在用作常规指导,不保证处于最新状态。 有关详细的应用注册说明,请参阅此 Microsoft快速入门

  1. 以至少应用程序开发人员身份登录到 Microsoft Entra 管理中心。

  2. 转到 “应用注册” ,在没有重定向 URL 的情况下创建新的注册。

  3. 转到 “证书和机密 > ”为应用创建机密

  4. 复制机密值并安全地存储它。

  5. 在应用的 “应用注册 > 概述 ”页上,复制 应用程序(客户端)ID

  6. 通过更新清单将应用修改为 V2 应用程序:

    1. 在应用的 “管理 ”部分中,选择“ 清单”。

    2. 在编辑器中,将accessTokenAcceptedVersion设置为2

    3. 保存更改。

将所需信息发送到 Azure Databricks 数据提供程序

如果你作为收件人使用 Microsoft Entra ID,则可以按照以下说明获取提供者要求的字段。 请始终参阅 Microsoft Entra ID 文档以获取最新的说明。

  • 颁发者 URLhttps://login.partner.microsoftonline.cn/{tenantId}/v2.0,用于将 {tenantId} 替换为你的 Entra 租户 ID。 如果不知道租户 ID,请参阅 Microsoft Entra ID 文档

  • 主题声明:指在 JWT 有效负载中用于识别访问数据的实体的字段。 使用的具体字段取决于您的身份提供商(IdP)和用例。 例如,在 Microsoft Entra ID 中的 M2M 应用程序中,使用者声明为 azp,这表示有权使用令牌的应用程序的客户端 ID。 有关详细信息,请参阅 Microsoft Entra ID 访问令牌声明参考

  • 对象:指接收方身份提供方(IdP)中注册的 OAuth 应用程序的唯一标识符。
    例如,在 Microsoft Entra ID 中,这是 应用程序(客户端)ID。 如果您在注册时未复制客户端 ID,可以按照 IdP 的特定步骤来检索它。 对于 Microsoft Entra ID,请执行以下步骤:

    1. 导航到 Microsoft Entra 管理中心中的 应用注册
    2. 选择已注册的 OAuth 应用程序。
    3. 在“概述”页上找到 应用程序(客户端)ID

    对于其他 IdP,请参阅其文档以检索等效标识符。

  • 受众:对于计算机到 Azure Databricks 身份验证,通常使用资源的clientId,但也可以指定任何其他有效的资源标识符。

    你在上一步中应已复制此项。 如果没有,请导航到Microsoft Entra 管理中心,搜索 应用注册,选择已注册的应用程序,然后在“概述”页上找到 应用程序(客户端)ID 。 您也可以使用不同的资源标识符。

与提供者共享颁发者、使用者声明、主题和受众。

将应用配置为使用 Databricks 提供者共享的 OAuth 配置文件

要将应用配置为从提供者访问增量共享共享,请执行以下操作:

  1. 请访问 Databricks 提供程序与你共享的 OIDC 配置文件门户的 URL。

    如果尚未收到 URL,请请求该 URL。

  2. 在门户页上,选择 M2M 磁贴,然后在 “对于 OAuth”下,单击“ 下载文件”。

  3. 修改下载的 oauth_config.share JSON 文件,以添加你的 clientIdclientSecretscope

    注册应用时,应已复制客户端 ID 和客户端密码。 不能再次检索客户端密码。 若要检索客户端 ID,请参阅上一部分的说明。

    如果选择将应用 {clientId} 用作受众,范围应为 {clientId}/.default。 例如,如果受众是 61a80fb9-ce0c-4794-9f7f-2ba42a7b76f6,范围应为 61a80fb9-ce0c-4794-9f7f-2ba42a7b76f6/.default

    示例配置文件:

    {
      "shareCredentialsVersion": 2,
      "endpoint": "https://oregon.cloud.databricks.com/api/2.0/delta-sharing/metastores/11a11aaa-11aa-11a12-11aa-111a1aa11111/recipients/a11da11aa1-a1a1-11a1-a11a-1111a11111aa",
      "tokenEndpoint": "https://login.partner.microsoftonline.cn/a111a111-1111-1aaa-1aa1-1aa1111aa1/oauth2/v2.0/token",
      "type": "oauth_client_credentials",
      "clientId": "[REPLACE_WITH_YOUR_CLIENT_ID]",
      "clientSecret": "[REPLACE_WITH_YOUR_CLIENT_SECRET]",
      "scope": "[REPLACE_WITH_YOUR_SCOPE]"
    }
    
  4. 安装和配置最新的 Delta 共享 Python OSS 客户端。

    必须具有最新版本的 Delta Sharing Python OSS 客户端。

    python3 -m venv .venv
    source .venv/bin/activate
    pip3 install "delta-sharing>=1.3.1"
    
  5. 保存更新的 oauth_config.share 文件。

  6. 测试配置:

    创建测试脚本, test.py

    import delta_sharing
    
    # Point to the profile file. It can be a file on the local file system or a file on a remote storage.
    
     profile_file = "oauth_config.share"
    
     # Create a SharingClient.
     client = delta_sharing.SharingClient(profile_file)
     #
     # List all shared tables.
     tables = client.list_all_tables()
    
     print(tables)
    
     # replace the following line with the coordinates of the shared table
     #table_url = profile_file + "#sample_share.sample_db.sample_table"
    
     # Fetch 10 rows from a table and convert it to a Pandas DataFrame.
     # This can be used to read sample data from a table that cannot fit in the memory.
     #df = delta_sharing.load_as_pandas(table_url, limit=10)
    
     #print(df)
    

    运行以下脚本:

    python3 test.py
    

    该脚本应列出共享表。