【发布时间】:2021-07-24 23:10:59
【问题描述】:
这是一个相当奇怪的问题。我需要生成一个可以与其他人共享的签名 url,以便在一定的时间限制内下载文件。显然,既然我说的是签名,你不应该要求任何事先许可来下载。以下是我用来上传和下载的代码
private final BlobSasPermission blobSasPermission = new BlobSasPermission()
.setReadPermission(true);
public String uploadAndGenerateSignedUrl(String filePath, String uploadPath) {
BlobClient blobClient = containerClient.getBlobClient(uploadPath);
blobClient.uploadFromFile(filePath);
BlockBlobClient blockBlobClient = blobClient.getBlockBlobClient();
BlobServiceSasSignatureValues blobServiceSasSignatureValues = new BlobServiceSasSignatureValues(
OffsetDateTime.now().plusMinutes(azureConfiguration.getExpiryMin()), blobSasPermission);
return blockBlobClient.getBlobUrl() + "?" + blockBlobClient
.generateSas(blobServiceSasSignatureValues);
}
public void downloadFromUrl(String signedUrl, File file) throws IOException {
OkHttpClient client = SharedClient.getNewSharedClientBuilder().build();
Request request = new Request.Builder()
.url(signedUrl)
.build();
okhttp3.Response response = client.newCall(request).execute();
InputStream inputStream = response.body().byteStream();
FileUtils.copyInputStreamToFile(inputStream, file);
}
现在,当我在浏览器中打开生成的 url 时,文件已成功下载。同样,在 PostMan 中为此 url 运行 GET 也可以正常工作。但是,当我将相同的 url 发送到下载方法时,它会失败并出现错误 403,说明服务器无法验证请求。我对此一无所知。我尝试将 http 和 https 协议都添加到签名的 url,但这也没有帮助。
编辑:
添加错误信息Response{protocol=http/1.1, code=403, message=Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature., url=https://{account}.blob.core.windows.net/{container}/MDConnector/MDTest/Test_16269425/2021-07-24/1627125196450/NormalFile.md?sv=2019-07-07&se=2021-07-24T12:13:18Z&sr=b&sp=r&sig=BoTaZ9iEA8Cdcbscf6zpWTol32+52rfVyLNDMBlLr1Q=}
【问题讨论】:
-
您确定您的浏览器或邮递员中没有可用的 cookie,其中包含意外使用的身份验证详细信息。没有完整的错误,我建议您调用的端点需要某种形式的身份验证握手。
-
并非如此。我也检查了隐身。我还注意到的一件不寻常的事情是,每当添加新文件时,它都会在下载时显示错误。但一段时间后,它开始正常工作