Ошибка 403 при попытке доступа к файловой системе в хранилище озера данных Azure Gen 2 через REST API - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь получить доступ к файловой системе в хранилище Azure Data Lake Gen 2 через REST API с использованием Java.Вот как я строю свой запрос:

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 сообщение об ошибке: Серверу не удалось аутентифицировать запрос.Убедитесь, что значение заголовка авторизации сформировано правильно, включая подпись.

не верны ли мои заголовки запроса?

1 Ответ

0 голосов
/ 27 сентября 2019

Согласно моему тесту, мы можем использовать аутентификацию Azure AD для вызова API хранилища данных Azure Gen2 REST API.Для получения дополнительной информации см. https://social.msdn.microsoft.com/Forums/en-US/45be0931-379d-4252-9d20-164261cc64c5/error-while-calling-adls-gen-2-rest-api-to-create-file?forum=AzureDataLake.

  1. Создание субъекта службы Azure AD и назначение ему роли RABC.Для получения дополнительной информации, пожалуйста, обратитесь к https://docs.microsoft.com/en-us/azure/storage/common/storage-auth-aad.
az ad sp create-for-rbac -n 'your sp name' --role 'Storage Blob Data Owner' --scope 'your scope such as your storage account scope'

enter image description here

Получить токен доступа
Method : POST 
URL: https://login.microsoftonline.com/<your Azure AD tenant domain>/oauth2/token
Body:
     grant_type =client_credentials 
    client_id=<the appid you copy>
    client_secret=<the password you copy>
    resource=https://storage.azure.com

enter image description here

Call rest api a.Создать файловую систему

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

enter image description here

b.Список файловой системы

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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...