Java 403尝试通过REST API访问Azure data lake storage Gen 2中的文件系统时出错

Java 403尝试通过REST API访问Azure data lake storage Gen 2中的文件系统时出错,java,azure,azure-data-lake,Java,Azure,Azure Data Lake,我正在尝试使用java通过RESTAPI访问azure data lake storage gen 2中的文件系统。这就是我构建请求的方式: public static void main(String[] args) throws Exception { String urlString = "https://" + account + ".dfs.core.windows.net/sterisfiles?resource=filesystem"; HttpURLConnect

我正在尝试使用java通过RESTAPI访问azure data lake storage gen 2中的文件系统。这就是我构建请求的方式:

public static void main(String[] args) throws Exception {
    String urlString = "https://" + account + ".dfs.core.windows.net/sterisfiles?resource=filesystem";
    HttpURLConnection connection = (HttpURLConnection)(new URL(urlString)).openConnection();
    getFileRequest(connection, account, key);
    connection.connect();
    System.out.println("Response message : "+connection.getResponseMessage());
}


public static void getFileRequest(HttpURLConnection request, String account, String key) throws Exception{
    SimpleDateFormat fmt = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss");
    fmt.setTimeZone(TimeZone.getTimeZone("GMT"));
    String date = fmt.format(Calendar.getInstance().getTime()) + " GMT";
    String stringToSign =  "GET\n"
            + "\n" // content encoding
            + "\n" // content language
            + "\n" // content length
            + "\n" // content md5
            + "\n" // content type
            + "\n" // date
            + "\n" // if modified since
            + "\n" // if match
            + "\n" // if none match
            + "\n" // if unmodified since
            + "\n" // range
            + "x-ms-date:" + date + "\n"
            + "x-ms-version:2014-02-14\n" //headers
            + "/"+account + request.getURL().getPath();
    String auth = getAuthenticationString(stringToSign);
    request.setRequestMethod("GET");
    request.setRequestProperty("x-ms-date", date);
    request.setRequestProperty("x-ms-version", "2014-02-14");
    request.setRequestProperty("Authorization", auth);
}

private static String getAuthenticationString(String stringToSign) throws Exception{
    Base64 base64 = new Base64();
    Mac mac = Mac.getInstance("HmacSHA256");
    mac.init(new SecretKeySpec(base64.decode(key), "HmacSHA256"));
    String authKey = new String(base64.encode(mac.doFinal(stringToSign.getBytes("UTF-8"))));
    String auth = "SharedKey " + account + ":" + authKey;
    return auth;
}
这将抛出带有以下消息的403错误: 服务器验证请求失败。确保授权标头的值格式正确,包括签名。


我的请求标题是否不正确

根据我的测试,我们可以使用Azure AD身份验证调用Azure data lake storage Gen2 REST API。有关更多详细信息,请参阅

  • 创建Azure AD服务主体并为其分配RABC角色。有关更多信息,请参阅
  • 获取访问令牌
  • b。列表文件系统

    PUT https://{accountName}.{dnsSuffix}/{filesystem}?resource=filesystem
    
    GET https://{accountName}.{dnsSuffix}/?resource=account
    


    谢谢Jim,我现在可以访问ADLS中的文件系统了。
    PUT https://{accountName}.{dnsSuffix}/{filesystem}?resource=filesystem
    
    GET https://{accountName}.{dnsSuffix}/?resource=account