在Java中为文件生成Azure SAS令牌:签名字段格式不正确
我尝试在Java中为Azure Data Lake Gen.2存储帐户中的文件生成SAS令牌,但每次尝试使用生成的令牌访问文件时,我都会收到错误“签名字段格式不正确” ,但使用了较旧版本的Azure SDK,签名是手动创建的。我正在使用最新版本的azure-storage-8.6.3,但也尝试了在Java中为文件生成Azure SAS令牌:签名字段格式不正确,java,azure,Java,Azure,我尝试在Java中为Azure Data Lake Gen.2存储帐户中的文件生成SAS令牌,但每次尝试使用生成的令牌访问文件时,我都会收到错误“签名字段格式不正确” ,但使用了较旧版本的Azure SDK,签名是手动创建的。我正在使用最新版本的azure-storage-8.6.3,但也尝试了8.0.0和7.0.0,但没有成功 这是我的密码: public class SasTokenExample { public static String generateSasToken(UR
8.0.0
和7.0.0
,但没有成功
这是我的密码:
public class SasTokenExample {
public static String generateSasToken(URI fileUri) throws StorageException, URISyntaxException, InvalidKeyException {
StorageCredentials credentials = new StorageCredentialsAccountAndKey("myaccount", "thisisnottheac+tualkeybutonlyanexampletode+monstratewhatsgoingonhere+12+34567890123456==");
CloudFile file = new CloudFile(fileUri, credentials);
SharedAccessFilePolicy policy = new SharedAccessFilePolicy();
policy.setPermissions(EnumSet.of(SharedAccessFilePermissions.READ));
policy.setSharedAccessStartTime(null);
policy.setSharedAccessExpiryTime(getExpirationTime());
return file.generateSharedAccessSignature(policy, null);
}
private static Date getExpirationTime() {
LocalDateTime expLDT = LocalDateTime.now().plusMinutes(30);
Instant expInstant = expLDT.atZone(ZoneId.systemDefault()).toInstant();
return Date.from(expInstant);
}
public static void main(String[] args) throws URISyntaxException, InvalidKeyException, StorageException, MalformedURLException {
URI uri = new URI("http://myaccount.blob.core.windows.net/mycontainer/my.file");
System.out.println(uri.toString() + "?" + generateSasToken(uri));
}
}
由此,我得到如下URL:
当我在浏览器中打开链接时,会得到以下结果:
身份验证失败
服务器无法对请求进行身份验证。确保包括签名在内的授权标头的值格式正确。
请求ID:3dfc7fb8-701e-0057-2054-25ADD300000
时间:2020-05-08T16:19:28.4764866Z
签名字段格式不正确。
我相信您的问题在于您正在使用SharedAccessFilePolicy
为blob
资源生成SAS URL(Data Lake Gen2资源基本上是blob)。您将需要使用。所以你的代码应该是:
CloudBlob file = new CloudBlob (fileUri, credentials);
SharedAccessBlobPolicy policy = new SharedAccessBlobPolicy ();
policy.setPermissions(EnumSet.of(SharedAccessBlobPermissions.READ));
policy.setSharedAccessStartTime(null);
policy.setSharedAccessExpiryTime(getExpirationTime());
return file.generateSharedAccessSignature(policy, null);
试试看,它应该会起作用。太酷了,非常感谢!只有一件事:被调用的构造函数需要是
newcloudpageblob(fileUri,credentials)
,因为CloudBlob
是抽象的。下面是完整的工作示例: