gpt4 book ai didi

java - 使用 token 通过注册应用程序访问 Azure Blob

转载 作者:行者123 更新时间:2023-12-03 00:56:16 29 4
gpt4 key购买 nike

我是 Azure 新手,正在努力让一个简单的演示正常运行。

我正在尝试编写一个访问 blob 的守护进程客户端。访问必须通过注册的应用程序进行,并且我想显式获取访问 token 。

作为热身,我编写了一个使用 blob api 访问 blob 的演示,并且效果很好:

ClientCertificateCredential credentials = new ClientCertificateCredentialBuilder()
.clientId("11518eab-7b5a-493c-8d12-27731fe51341")
.tenantId("4b106bc5-7518-4f86-a259-f5726d124732")
.pemCertificate("/home/william/cert/new/azure.pem")
.build();

BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
.credential(credentials)
.endpoint("https://wemsa.blob.core.windows.net/")
.buildClient();

BlobContainerClient blobContainerClient = blobServiceClient.getBlobContainerClient("wemco");

blobContainerClient.getBlobClient("spiral.jpeg")
.downloadToFile("/home/william/blob.jpeg");

上面的代码使用我注册的应用程序创建一个下载我的 blob 文件的 BlobClient。事实上,这有效地表明我的应用程序确实具有访问我的存储容器所需的角色。

我想创建第二个演示来执行相同的操作,但我想显式获取访问 token 并使用它来授权对 blob api 的纯 http 请求。到目前为止,这是我制作的:

private static final String TENANT_ID = "4b106bc5-7518-4f86-a259-f5726d124732";
private static final String CLIENT_ID = "11518eab-7b5a-493c-8d12-27731fe51341";
private static final String AUTHORITY = "https://login.microsoftonline.com/" + TENANT_ID;
private static final Set<String> SCOPE = Collections.singleton("api://" + CLIENT_ID + "/.default");


InputStream pkcs12Cert = new FileInputStream("/home/william/cert/new/azure.p12");
String certPwd = "password123";
IClientCredential credential = ClientCredentialFactory.createFromCertificate(pkcs12Cert, certPwd);

ConfidentialClientApplication cca = ConfidentialClientApplication
.builder(CLIENT_ID, credential).authority(AUTHORITY).build();

ClientCredentialParameters parameters = ClientCredentialParameters.builder(SCOPE).build();

IAuthenticationResult result = cca.acquireToken(parameters).join();
String token = result.accessToken();

URI uri = new URI("https://wemsa.blob.core.windows.net/wemco/spiral.jpeg");

HttpClient httpClient = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(uri)
.header("Authorization", "Bearer " + token)
.header("Date", formatNow())
.header("x-ms-version", "2020-06-12")
.GET()
.build();

HttpResponse<String> response = httpClient.send(request, BodyHandlers.ofString());

System.out.println(response.statusCode()); // 401 !!!

这使用与第一个演示相同的注册应用程序。调试告诉我它已成功获取访问 token 。但是,当我尝试使用它们时,我总是收到 401 响应。我曾希望,由于第一个演示工作正常,第二个演示也能自动工作 - 但事实并非如此。

  • 我想做的事情可能吗?
  • 我的第二个演示中的代码有问题吗?
  • 在演示 2 运行之前,我是否需要在 Azure 中进行更多设置?一些 Azure 文档提到创建应用程序角色,我尝试过,但我不知道如何处理它。

有什么建议吗?

<小时/>

附加信息:这是我在 Azure 中所做的(接受所有内容的默认值):

  • 创建存储帐户wemsa
  • wemsa内创建容器wemco
  • 将(一个小)文件“spiral.jpeg”上传到容器wemco
  • 创建应用注册wemapp
  • 将证书“azure.crt”上传到wemapp

然后我回到容器wemco并且:

  • wemapp 授予“存储 Blob 数据贡献者”角色

这足以让演示 1 正常工作。

最佳答案

通过将范围(即请求的资源)更改为 azure 存储来修复:

private static final Set<String> SCOPE = 
Collections.singleton("https://storage.azure.com//.default");

进行此更改后,我可以使用原始帖子中的演示 2 代码下载我的 blob 文件。

关于java - 使用 token 通过注册应用程序访问 Azure Blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68089256/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com