ISAPI Delphi 中的读承载

tjjdgumg  于 2023-08-04  发布在  其他
关注(0)|答案(1)|浏览(76)

我在 * Delphi 10.2* 中有ISAPI DLL项目,我需要 * 读取 * 所有头项,确切地说是Authorization Bearer来接受或不接受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;


但是,我不知道如何读取授权,我的request中总是空的。TWebModule1.WebModuleBeforeDispatch中的授权
如果我的头中有:接受编码:gzip,deflate Content-Type:application/json Host:localhost:811 User-Agent:Apache-HttpClient/4.1.1(java 1.5)Content-Length:396授权:基础VEVDSF...... cCNG

  • 没关系,请求。授权=基本....

但是如果我写授权:Bearer eyJhbGciOiJS....Im

  • 这是KO,请求。授权= ''
eblbsuwk

eblbsuwk1#

ISAPI Web应用程序中TWebModuleRequest属性的值是Web.Win.IsapiHTTPTISAPIRequest类的示例。通过EXTENSION_CONTROL_BLOCK结构的GetServerVariable函数实现阅读Authorization属性的值。getter最终在TISAPIRequest.GetFieldByNameA方法中结束,该方法只能从单个HTTP头中读取最多4095字节的数据。在减去'Bearer '前缀的大小后,这将承载令牌限制为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
  // 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'));

相关问题