READ Bearer в ISAPI DELPHI

У меня есть проект 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

  • все нормально, request.Authorization=Basic....

Но если я напишу Авторизация: Предъявитель eyJhbGciOiJS....Im

  • это нокаут, request.Authorization = ''

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

Peter Wolf 29.06.2023 15:22

действительно, вы правы, это вопрос длины, я пробовал с несколькими байтами, у меня есть авторизация Beareer, теперь мой вопрос, как это сделать, если мой токен 6845 байт, спасибо

Bill.Parish 29.06.2023 16:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Значением свойства 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

Другие вопросы по теме