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

Решение Проблемы Чтения Заголовков Авторизации в ISAPI-Проектах на Delphi: Уроки DatasnapBroker

Delphi , Синтаксис , API реализация

Вопрос, поднятый пользователем, связан с необходимостью чтения заголовков авторизации, в частности, токенов типа Bearer, в проектах ISAPI на Delphi. При использовании компонента DatasnapBroker и выполнения кода с FServer := TIdHTTPWebBrokerBridge.Create(Self); и обработчиком аутентификации, чтение заголовков авторизации проходит успешно. Однако, при работе с модулем TWebModule1.WebModuleBeforeDispatch возникает проблема: заголовок авторизации не читается, если используется токен Bearer.

Проблема

Заголовок авторизации успешно считывается в случае использования метода Basic, но при попытке прочитать токен Bearer, значение в request.Authorization оказывается пустым.

Пример Заголовка

Предположим, у вас есть следующий HTTP-заголовок:

Accept-Encoding: gzip,deflate
Content-Type: application/json
Host: localhost:811
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Content-Length: 396
Authorization: Basic VERDF......cCNG

В этом случае request.Authorization корректно отображает значение авторизации для Basic.

Если же вы попытаетесь установить заголовок авторизации с Bearer-токеном:

Authorization: Bearer eyJhbGciOiJS....Im

То значение в request.Authorization будет пустым.

Анализ Проблемы

После анализа реализации функции TISAPIRequest.GetFieldByNameA из модуля Web.Win.IsapiHTTP.pas было обнаружено, что значения заголовков ограничены 4095 байтами (без учета символа завершения строки). После вычитания длины префикса 'Bearer ' (7 байт) получаем максимальный размер токена в 4088 байт. Если токен превышает этот размер, он будет возвращен как пустая строка.

Решение Проблемы

Для обхода ограничения TISAPIRequest можно реализовать свой метод расширения для чтения данных запроса:

uses
  Winapi.Windows, Web.Win.IsapiHTTP;

type
  TISAPIRequestHelper = class helper for TISAPIRequest
  public
    function GetServerVariable(const Name: UTF8String): UTF8String;
  end;

function TISAPIRequestHelper.GetServerVariable(const Name: UTF8String): UTF8String;
var
  Size: DWORD;
begin
  // расчет размера
  Size := 0;
  ECB.GetServerVariable(ECB.ConnID, PUTF8Char(Name), nil, Size);
  if Size <= 1 then
  begin
    Result := '';
    Exit;
  end;
  // получение фактического значения переменной
  SetLength(Result, Size - 1);
  if not ECB.GetServerVariable(ECB.ConnID, PUTF8Char(Name), PUTF8Char(Result), Size) then
    Result := '';
end;

Чтобы получить доступ к заголовку авторизации, вызовите:

string((Request as TISAPIRequest).GetServerVariable('HTTP_AUTHORIZATION'));

Этот метод позволяет читать заголовки, не ограниченные стандартным размером TISAPIRequest.

Заключение

Для работы с токенами Bearer большого размера необходимо использовать альтернативные методы чтения заголовков, превышающих стандартное ограничение в 4095 байт. Предложенный метод расширения позволяет обойти это ограничение и корректно обрабатывать большие токены.

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

Вопрос касается решения проблемы чтения заголовков авторизации, в частности, токенов типа Bearer, в ISAPI-проектах на Delphi, используя компонент DatasnapBroker, и предложено решение через создание собственного метода для чтения заголовков, обх


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

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




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


:: Главная :: API реализация ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 11:39:46/0.0053219795227051/1