Einzelnen Beitrag anzeigen

Caps

Registriert seit: 23. Mär 2006
Ort: Leipzig
299 Beiträge
 
#1

401 Unauthorized - jedoch eigentlich keine Athentifizierung erforderlich

  Alt 31. Aug 2023, 10:54
Hallöle,

ich muss einen REST-Service mit D7 ansprechen (es muss leider D7 sein, da komme ich nicht drum herum, habe ich mir nicht ausgesucht).

Es ist keine Authentifizierung erforderlich, und mit dem Postman bekomme ich auch ein Ergebnis, jedoch mit Delphi nicht.
Ich verwende die Indy10-Komponenten.

Folgendes ist die Prozedur, mit der ich versuche den REST-Service anzusprechen:

Delphi-Quellcode:
procedure TfrmMain.btnListClick(Sender: TObject);
var
  ComObj: TWEBComm;
  IdHTTP: TIdHTTP;
  URL: String;
  AuthorizationString: String;
  Response: TStringStream;
begin
  try
    URL := 'https://<großes Geheimnis>';
    AuthorizationString := '<großes Geheimnis>';

    ComObj := TWEBComm.Create; // Interne Komponente
    IdHTTP := TIdHTTP.Create;
    Response := TStringStream.Create('');

    with ComObj do begin
      with IdHTTP do begin
        ConnectTimeout := 5000;
        ReadTimeout := 10000;
        HTTPOptions := [];
        Request.CustomHeaders.Text := 'x-token: ' + AuthorizationString;
      end;

      Create_HTTPS(IdHTTP); // Internes Gedönse
      if sConMsg = 'OKthen begin
        try
          IdHTTP.Get(URL, Response); // Hier kriege ich einen 401 Unauthorized
          memoJson.Text := Response.DataString;
        except
          on e: Exception do begin
            ShowMessage('Fehler in IdHTTP: '#13#10 + e.Message);
          end;
        end;
      end else begin // Fehler...
        ShowMessage('Fehler in ComObj: ' + sConMsg);
      end;
    end;

  finally
    FreeAndNil(Response);
    FreeAndNil(IdHTTP);
    FreeAndNil(ComObj);
  end;
end;
Ok, das ist nur ein Testprogramm, daher habe ich alles in den Click-Handler gepackt, aber das ist auch nicht das Problem.
Das interne Gedönse ist nicht das Problem, da ich beim Aufruf eines anderen Endpunktes des gleichen Servers keinen 401 kriege, sondern alles glatt läuft.

Also sorry für eventuelles Chaos.
Meine Frage lässt sich glaube ich ugf. so zusammenfassen:

Ich kann den fraglichen REST-Endpunkt mit dem Postman problemlos ansprechen - mit Delphi leider nicht. Warum?
Ich kriege im Delphi einen 401, im Postman aber nicht, und eine Authentifizierung ist am Service auch nicht erforderlich.

Das x-token in den CustomHeaders ist korrekt, im Postman wie im Delphi - daran liegt es nicht. Das wird auch nicht vom Webserver ausgewertet sondern vom dem Service dahinter - der 401 kommt aber vom Webserver.

Ich habe mal die Indy-Unit durchdebuggt, um die RawHeaders auszulesen, und da stand nur folgendes drin:
Code:
Host: api.glasmatic-services.net
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/3.0 (compatible; Indy Library)
Der Postman schickt folgende Header:
Code:
Cache-Control: no-cache
Postman-Token: <calculated when request is sent>
Host: <calculated when request is sent>
User-Agent: PostmanRuntime/7.26.8
Accept: */*
Accept-Encodig: gzip, deflate, br
Connection: keep-alive
x-token: <großes Geheimnis>
Tja

Über jeden Hinweis dankbar verbleibt
Caps
"Der Mode cmCFS8 ist prohibitär und von mir entwickelt."
  Mit Zitat antworten Zitat