Вопрос, поднятый пользователем, связан с необходимостью чтения заголовков авторизации, в частности, токенов типа Bearer, в проектах ISAPI на Delphi. При использовании компонента DatasnapBroker и выполнения кода с FServer := TIdHTTPWebBrokerBridge.Create(Self); и обработчиком аутентификации, чтение заголовков авторизации проходит успешно. Однако, при работе с модулем TWebModule1.WebModuleBeforeDispatch возникает проблема: заголовок авторизации не читается, если используется токен Bearer.
Проблема
Заголовок авторизации успешно считывается в случае использования метода Basic, но при попытке прочитать токен Bearer, значение в request.Authorization оказывается пустым.
В этом случае 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