Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Ошибка OAuth2 после обновления Indy: восстановление корректного кодирования специальных символов

Delphi , Синтаксис , Кодировки

Ошибка OAuth2 после обновления Indy: восстановление корректного кодирования специальных символов

В статье рассматривается проблема, возникшая после обновления компонента Indy до версии Indy 10 SVN 5412, связанная с ошибкой 400 Bad Request при запросе OAuth2 токена. Проблема заключалась в том, что специальные символы в запросе не кодировались должным образом, что приводило к ошибке на стороне сервера.

Описание проблемы

При использовании Indy 10.0.52 запрос на получение OAuth2 токена проходил успешно, но после обновления до Indy 10 SVN 5412 начались проблемы с кодированием специальных символов в запросе. В частности, символ процента (%) не кодировался как %25, что является стандартным поведением для URL-адресов.

Контекст

Исходный код на Object Pascal для запроса токена OAuth2 содержит использование TMemoryStream для отправки данных. Однако, в новой версии Indy, TIdHTTP не выполняет кодирование содержимого TMemoryStream, что делает ответственность за корректное форматирование данных лежащей на разработчике.

Подтвержденный ответ

Разработчик должен убедиться, что данные, отправляемые через TIdHTTP, правильно форматированы. Вместо использования TMemoryStream можно использовать перегрузку TIdHTTP.Post(TStrings), которая автоматически кодирует строки в формате application/x-www-form-urlencoded.

В Indy 10.0.52 метод TIdHTTP.Post(TStrings) кодировал только значения параметров, используя TIdURI.ParamsEncode, и только символы из набора '*#%<> []' или не-ASCII символы в диапазоне от #33 до #128 включательно.

В последних версиях Indy (на момент написания статьи 10.6.2.5418), TIdHTTP.Post(TStrings) поддерживает Unicode и кодирует как имена, так и значения параметров в соответствии со стандартом HTML5, кодируя любые Unicode символы, не входящие в набор 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789*-._'.

Решение

Для решения проблемы рекомендуется использовать TStringList и метод TIdHTTP.Post(TStrings) для отправки данных. Пример кода на Object Pascal:

try
  WXYZUserID   := Trim(GetSettingsValue(mySQLQuery, wcsWXYZUserID, ''));
  WXYZPassword := Trim(GetSettingsValue(mySQLQuery, wcsWXYZPassword, ''));
  WXYZSecret   := Trim(GetSettingsValue(mySQLQuery, wcsWXYZSecret, ''));
  OAuthURL     := Trim(GetSettingsValue(mySQLQuery, wcsOAuthURL, ''));

  WxyzHttp := TIdHttp.Create(nil);
  try
    WxyzHttp.ConnectTimeout := 60000;

    IdLogFile := TIdLogFile.Create(WxyzHttp);
    IdLogFile.Filename := 'Logs/WxyzHTTP' + FormatDateTime('yyyymmdd_hhnnsszzz', now) + '.log';
    IdLogFile.Active := True;

    IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(WxyzHttp);
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvSSLv23;
    IdSSLIOHandlerSocketOpenSSL1.Intercept := IdLogFile;
    WxyzHttp.IOHandler := IdSSLIOHandlerSocketOpenSSL1;

    if (WXYZSecret <> '') then
      WxyzHttp.Request.CustomHeaders.Values['Authorization'] := 'Basic ' + WXYZSecret
    else
      WxyzHttp.Request.CustomHeaders.Values['Authorization'] := 'Basic ****************************************************************';

    WxyzHttp.Request.ContentType := 'application/x-www-form-urlencoded';
    WxyzHttp.Request.CharSet := 'utf-8';

    Serial := TStringList.Create;
    try
      Serial.Add('grant_type=password');
      if (WXYZUserID <> '') and (WXYZPassword <> '') then
      begin
        Serial.Add('username=' + WXYZUserID);
        Serial.Add('password=' + WXYZPassword);
      end
      else
      begin
        Serial.Add('username=****-*****');
        Serial.Add('password=***************');
      end;

      Token := WxyzHttp.Post(OAuthURL, Serial);
    finally
      Serial.Free;
    end;
  finally
    WxyzHttp.Free;
  end;
except
  on E: Exception do
  begin
    DbgWebCatLog(wcmtDbg, 'GetSerialToken', E.ClassName + ' error raised, with message: ' + E.Message, '');
    Token := '';
  end;
end;

Заключение

Переход на использование TStringList и метода TIdHTTP.Post(TStrings) позволяет автоматически кодировать специальные символы в запросе, что решает проблему с ошибкой 400 Bad Request после обновления Indy до последней версии.

Создано по материалам из источника по ссылке.

### Описание: В статье рассматривается проблема, связанная с неправильным кодированием специальных символов в запросе OAuth2 после обновления компонента Indy, и предлагается решение через использование метода `TIdHTTP.Post(TStrings)` для корректной отпра


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Кодировки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 13:02:04/0.0059030055999756/1