У меня есть проект ISAPI DLL в Delphi 10.2, мне нужно *** прочитать *** все элементы заголовка, а именно носитель авторизации, чтобы принять или не принять запрос POST. С exe DatasnapBroker это успех с этим кодом
FServer := TIdHTTPWebBrokerBridge.Create(Self);
FServer.OnParseAuthentication := OnDoParseAuthentication;
и в функции OnDoParseAuthentication
procedure TForm1.OnDoParseAuthentication(AContext: TIdContext; const AAuthType,
AAuthData: String; var VUsername, VPassword: String; var VHandled: Boolean);
function DoParseAuthentication(ASender: TIdContext; const AAuthType,
AAuthData: String; var VUsername, VPassword: String): Boolean;
var
s,__BaseName, __GuidBase: String;
begin
Result := False;
if TextIsSame(AAuthType, 'Basic') then begin
with TIdDecoderMIME.Create do try
s := DecodeString(AAuthData);
finally Free; end;
VUsername := Fetch(s, ':');
VPassword := s;
Result := True;
end
else if TextIsSame(AAuthType, 'Bearer') then
begin
with TIdDecoderMIME.Create do try
s := DecodeString(AAuthData);
finally Free; end;
//decrypt jwt or oauth2.0 in my Tjwt.Decodejwt_Bearer class
//for header / payload-data / signature
//sur ISAPI uniquement ici, sur exe lors du create
if Tjwt.Decodejwt_Bearer(AAuthData,__BaseName, __GuidBase) then
begin
//verifier et valider
Result := True;
end;
end;
end;
begin
VHandled := DoParseAuthentication(AContext, AAuthType, AAuthData, VUsername, VPassword);
end;
Но, я не знаю, как читать авторизацию, у меня в запросе всегда пусто. Авторизация в TWebModule1.WebModuleBeforeDispatch
если у меня есть в моем заголовке: Accept-Encoding: gzip, deflate Тип содержимого: приложение/json Хост: локальный: 811 Пользовательский агент: Apache-HttpClient/4.1.1 (java 1.5) Длина контента: 396 Авторизация: **Базовая **VEDVDSF......cCNG
Но если я напишу Авторизация: Предъявитель eyJhbGciOiJS....Im
действительно, вы правы, это вопрос длины, я пробовал с несколькими байтами, у меня есть авторизация Beareer, теперь мой вопрос, как это сделать, если мой токен 6845 байт, спасибо





Значением свойства Request элемента TWebModule в веб-приложении ISAPI является экземпляр класса TISAPIRequest из Web.Win.IsapiHTTP. Он реализует чтение значения свойства Authorization через GetServerVariable функцию структуры EXTENSION_CONTROL_BLOCK. Геттер заканчивается в методе TISAPIRequest.GetFieldByNameA, который может считывать только до 4095 байт данных из одного заголовка HTTP. Это ограничивает токен носителя до 4088 байт после вычитания из него размера префикса 'Bearer '.
Чтобы обойти это ограничение 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
// calculate size
Size := 0;
ECB.GetServerVariable(ECB.ConnID, PUTF8Char(Name), nil, Size);
if Size <= 1 then
begin
Result := '';
Exit;
end;
// get the actual variable value
SetLength(Result, Size - 1);
if not ECB.GetServerVariable(ECB.ConnID, PUTF8Char(Name), PUTF8Char(Result), Size) then
Result := '';
end;
Чтобы получить доступ к заголовку Authorization, вы должны вызвать:
string((Request as TISAPIRequest).GetServerVariable('HTTP_AUTHORIZATION'));
спасибо, все в порядке, я могу читать свой jwt
Какова длина токена на предъявителя? Если вы проверите реализацию
TISAPIRequest.GetFieldByNameAвWeb.Win.IsapiHTTP.pas, вы обнаружите, что значения заголовков ограничены 4095 байтами (исключая нулевой терминатор). После вычитания длины префикса'Bearer '(7) вы получите 4088 как максимальный размер токена на предъявителя. Все, что длиннее, будет возвращено как пустая строка.