首页 > 解决方案 > Azure Blob 存储出现 403 错误服务器无法对请求进行身份验证

问题描述

我目前正在执行 SAS URL 的突发活动,以从 Azure 上传、下载和删除 blob,但某些 URL 返回 403 错误

“服务器未能对请求进行身份验证。确保 Authorization 标头的值正确形成,包括签名。”

我已经创建了正确的 SAS 并执行了 URL,但仍然不确定如何修复它,因为我生成了类似这样的 URL

https://mystorageaccount.blob.core.windows.net/mycontainer/dBaNbbdPUt_k01?sig=R9qhdgLYwpkzyumbo1d3P3DSG3VzmJSSNKGPRE9b0c0%3D&st=2020-07-31T12%3A35%3A04Z&se=2020-07-31T13%3A35%300s- r&sr=b

这是我的示例代码,用于生成 SAS URL 以进行上传并执行它:

public static URL generateUploadSignedURL(String filename, String userId) throws URISyntaxException, StorageException, InvalidKeyException, MalformedURLException {
        CloudBlobContainer container = cloudBlobAdmin.getContainerReference(bucketData);
        CloudBlockBlob blob = container.getBlockBlobReference(filename);
        SharedAccessBlobPolicy sasPolicy = new SharedAccessBlobPolicy();

        Instant instant = Instant.now();
        sasPolicy.setSharedAccessStartTime(Date.from(instant));
        sasPolicy.setSharedAccessExpiryTime(Date.from(instant.plus(1, ChronoUnit.HOURS))); // Use the start time delta one hour as the end time for the shared

        sasPolicy.setPermissions(EnumSet.of(
                SharedAccessBlobPermissions.WRITE)
        );

    String token = blob.generateSharedAccessSignature(sasPolicy, null);
    String url = blob.getUri()+"?"+token;
    System.out.println(blob.getUri()+"?"+token);
    return new URL(url);
}

public static int uploadFileWithUrl(InputStream inputStream, URL url) throws IOException {
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setDoOutput(true);
    connection.setRequestMethod("PUT");
    if (url.toString().contains("blob.core.windows.net")) { // for azure urls add request property
        connection.setRequestProperty("x-ms-blob-type", "BlockBlob");
    }
    connection.setRequestProperty("User-Agent", "Multi-Cloud-Management-SignedURL");

    File tempFile = new File("src/main/resources/input.tmp");
    FileUtils.copyInputStreamToFile(inputStream, tempFile);

    DataOutputStream out = new DataOutputStream (connection.getOutputStream());
    out.write(Files.readAllBytes(Paths.get(tempFile.toURI())));
    out.close();

    connection.getResponseCode();
    //System.out.println("HTTP response code: " + connection.getResponseCode());

    connection.disconnect();
    tempFile.delete();

    return connection.getResponseCode();
}

标签: javaazureazure-blob-storage

解决方案


推荐阅读