Запрос PUT: PHP-код для Arduino HTTPClient

Я загружаю файл в хранилище BLOB-объектов Azure с помощью запроса REST API. Файл успешно загружен с помощью запроса PHP curl. Но когда я передаю код в HTTP-клиент ESP32, я получаю сообщение об ошибке аутентификации. Я также проверяю ключ HMAC, сгенерированный кодом ESP32 Arduino, в коде PHP. Я думаю, что я что-то упускаю при добавлении заголовка. Вот мой PHP-код:

       $header = array (
        "x-ms-blob-type: BlockBlob",
        "x-ms-date: " . $date,
        "x-ms-version: " . $version,
        "Authorization: SharedKey account_name:" . $signature_str,
        "Content-Type: text/plain; charset=UTF-8",
        "Content-Length: " . strlen($fdata),
        );

    $url =  "https://acount_name.blob.core.windows.net/container/test.txt";
    $ch = curl_init ();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt ( $ch, CURLOPT_CUSTOMREQUEST, 'PUT' );
    curl_setopt ( $ch, CURLOPT_URL, $url );
    curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt ( $ch, CURLOPT_HTTPHEADER, $header);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $fdata);
    curl_setopt ( $ch, CURLOPT_HEADER, True );
    echo($ch);
    curl_exec ( $ch );

а вот соответствующий код Arduino IDE:

    String sig = get_hmac();
      Serial.println(sig);

      if (WiFi.status() == WL_CONNECTED) { //Проверяем статус соединения WiFi
        HTTPClient http;
        http.begin("https://account_name.blob.core.windows.net/container/test.txt"); // Указываем место назначения для HTTP-запроса

        http.addHeader("x-ms-blob-type", "BlockBlob");
        http.addHeader("x-ms-date", Date);
        http.addHeader("x-ms-version", "2018-03-28");
        http.addHeader("Authorization", "SharedKey account_name:"+sig);
        http.addHeader("Content-Type", "text/plain; charset=UTF-8");
        http.addHeader("Content-Length",  "20");

        int httpResponseCode = http.PUT(d);   
        if (httpResponseCode > 0) {
          String response = http.getString(); 
          Serial.println(httpResponseCode);   
          Serial.println(response);        
        } else {
          Serial.print("Error on sending POST: ");
          Serial.println(httpResponseCode);
        }
        http.end();  //Свободные ресурсы
      } else {
        Serial.println("Error in WiFi connection");
      }

Я получаю сообщение об ошибке:

Подпись MAC, найденная в HTTP-запросе 'sVrSFpplX+Gkcb4R/iSDf6eqUP4srkZuVD68/pAeYwE=' не совпадает с любым вычисленная подпись.....

Хотя подпись HMAC, созданная из той же строки, работает в PHP вот справочная страница API: https://docs.microsoft.com/en-us/rest/api/storageservices/ положить-блоб Спасибо

, 👍1

Обсуждение

http.PUT(d); добавляет заголовок Content-length, заголовок Host, заголовок User-Agent, заголовок Accept-Encoding и заголовок Connection. Это нормально для авторизации SharedKey?, @Juraj

Похоже, что это сообщение об ошибке исходит от веб-службы; похоже, что это может быть больше отладка веб-сервиса, чем арудино. Какой код состояния вы получаете?, @esoterik

первый код использует «SharedKey mikeiot», второй код использует «SharedKey account_name:», может ли это быть проблемой? Вы также жестко кодируете длину содержимого во втором коде, возможно, вы отправляете неправильную сумму?, @esoterik

@Juraj Мне нужен собственный заголовок, как указано в коде Arduino «addHeader». Можно отправлять эти заголовки. я должен пропустить заголовок Content-length?, @Dani

@esoterik Я получаю код ответа 403 от сервера и сообщение об ошибке, показанное в сообщении, @Dani

@esoterik имя учетной записи такое же в коде, просто измените описание сообщения. Теперь я его отредактировал, @Dani


1 ответ


Лучший ответ:

2

Я получил подсказку из ответа @esoterik и смог успешно отправить запрос. Проблема заключалась в добавлении параметра заголовка:

 http.addHeader("Content-Length",  "20");

Это дублирует заголовок (второй добавлен в методе PUT). Я просто комментирую это, и код работает. Спасибо за каждый ответ

,