如何使用租户 ID、客户端 ID 和客户端密码连接和管理 Azure Data Lake Storage Gen2 中的目录和文件?

Posted

技术标签:

【中文标题】如何使用租户 ID、客户端 ID 和客户端密码连接和管理 Azure Data Lake Storage Gen2 中的目录和文件?【英文标题】:How can I use tenant id, client id and client secret to connect to and manage directories and files in Azure Data Lake Storage Gen2? 【发布时间】:2021-03-03 18:33:58 【问题描述】:

我想在 azure blob storage gen2 中上传文件。但问题是无法使用租户 ID、客户端 ID 和客户端密码进行连接。我指的是文档->https://docs.microsoft.com/en-us/azure/storage/blobs/data-lake-storage-directory-file-acl-java#upload-a-file-to-a-directory中给出的Java代码。

static public DataLakeServiceClient GetDataLakeServiceClient
    (String accountName, String clientId, String ClientSecret, String tenantID)

    String endpoint = "https://" + accountName + ".dfs.core.windows.net";
        
    ClientSecretCredential clientSecretCredential = new ClientSecretCredentialBuilder()
    .clientId(clientId)
    .clientSecret(ClientSecret)
    .tenantId(tenantID)
    .build();
           
    DataLakeServiceClientBuilder builder = new DataLakeServiceClientBuilder();
    return builder.credential(clientSecretCredential).endpoint(endpoint).buildClient();
 

但在上述代码的最后一行出现端点错误。

来自邮递员:

URI http://localhost:8081/upload/
Request param : <file to be uploaded>

"error": "Internal Server Error",
"message": "java.lang.NoClassDefFoundError: com/azure/core/implementation/util/ImplUtils"

【问题讨论】:

由于 SAS 令牌错误来自 DataLakeServiceClientBuilder::endpoint() 似乎有些问题,但不知道为什么!!! 【参考方案1】:

如果要访问 Azure 数据湖 gen2 vai Azure AD 身份验证,我们需要为 sp 或用户分配一个特殊的 Azure RABC 角色(Storage Blob Data OwnerStorage Blob Data ContributorStorage Blob Data Reader)。更多详情请参考here。

例如

    创建服务主体并将 Storage Blob Data Contributor 分配给存储帐户级别的 sp
az login
az ad sp create-for-rbac -n "MyApp" --role 'Storage Blob Data Contributor' \
    --scopes /subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>
    代码(下载文件)
String clientId="<sp appId>";
        String ClientSecret="<sp password>";
        String tenantID="";
        ClientSecretCredential clientSecretCredential = new ClientSecretCredentialBuilder()
                .clientId(clientId)
                .clientSecret(ClientSecret)
                .tenantId(tenantID)
                .build();
        String accountName="";
        DataLakeServiceClient serviceClient  = new DataLakeServiceClientBuilder()
                 .credential(clientSecretCredential)
                 .endpoint("https://" + accountName + ".dfs.core.windows.net")
                .buildClient();

        DataLakeFileSystemClient fileSystemClient =serviceClient.getFileSystemClient("test");
        DataLakeFileClient fileClient = fileSystemClient.getFileClient("test.txt");
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        fileClient.read(outputStream);
        byte[] data =outputStream.toByteArray();
        System.out.println("The file content : "+new String(data));

【讨论】:

如果对你有用,可以accept it as an answer吗? 您好 Jim,我正在尝试使用 Postman 工具对此进行测试,但未获得 401。需要添加一些密钥吗?这可以从代码中处理吗? 如何验证端点,然后上传或下载文件? @javageekssb,关于此问题,您可以使用 Azure AD 客户端凭据流获取令牌,然后使用该令牌调用 azure blob rest API。更多详情请参考docs.microsoft.com/en-us/azure/active-directory/develop/…和docs.microsoft.com/en-us/rest/api/storageservices/…

以上是关于如何使用租户 ID、客户端 ID 和客户端密码连接和管理 Azure Data Lake Storage Gen2 中的目录和文件?的主要内容,如果未能解决你的问题,请参考以下文章

考虑租户 ID 的自动增量

Paypal Rest API - 如何获取客户端 ID 和密码?

当我拥有客户端 ID 和客户端密码时,如何从使用 OAuth2.0 身份验证的 API 获取数据? (亮稿)

如何使用客户端ID和密码访问spotify的web api?

如何生成 OAuth 2 客户端 ID 和密钥

如何生成 OAuth 2 客户端 ID 和密钥