Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中为文件生成Azure SAS令牌:签名字段格式不正确_Java_Azure - Fatal编程技术网

在Java中为文件生成Azure SAS令牌:签名字段格式不正确

在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

我尝试在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(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
是抽象的。下面是完整的工作示例: