none
Authentifizierung bei Webservice (Promt) RRS feed

  • Frage

  • Hallo zusammen,

    ich muss von einem Rest-Webservice Daten abfragen, jedoch komme ich nicht um die Authentifizierung rum.

    wenn ich die URL im Browser aufrufe ploppt ein Eingabefenster für Benutzername/Password auf.

    Meine Idee, die Credentials über die URL mit zu geben ("http://user:pw@url") hat nicht geklappt:

    SET @url= 'http://'+@rest_user+':'+@rest_pw+'@'+ @adress +'/services/cdr'
    Exec @hr=sp_OACreate 'MSXML2.ServerXMLHTTP.6.0', @Object OUT;

    Hierbei bekomme ich nur die Meldung "Die URL ist ungültig." zurück.

    Wie kann ich die Credentials übergeben?

    Mittwoch, 29. Mai 2019 12:13

Antworten

  • Hi,

    Basic Authorization wird in der Regel mit einem Base64 codierten String, der im Authorization Header übergeben wird, durchgeführt.

    Du musst daher zwei Dinge tun:

    1. Den Base64 String aus Benutzername:Passwort erzeugen.

    2. Dem Http Objekt sagen, dass dieser Wert im Authorization Header mitgegeben werden muss.

    DECLARE @UserData      varchar( 255 ) = 'testuser:testpwd';
    DECLARE @Authorization varchar( 255 );
    
    -- Umwandlung der Zugangsinformationen in Base64
    SELECT @Authorization = 'Basic ' + col
    FROM   OPENJSON
    (
        (
            SELECT col
            FROM   ( SELECT CAST( @UserData AS varbinary( MAX ) ) AS col ) T
            FOR    json auto
        )
    ) WITH( col varchar( max ) )
    
    DECLARE @Url          varchar( 255 ) = 'http://server/adresse';
    DECLARE @ResultString nvarchar( MAX );
    DECLARE @Result       table( content nvarchar( MAX ) );
    DECLARE @Hr           int;
    DECLARE @Http         int;
    
    -- Objekt für HttpRequest erzeugen, dessen Eigenschaften setzen und die Antwort auslesen EXEC @Hr = sp_OACreate 'WinHttp.WinHttpRequest.5.1', @Http OUT; EXEC @hr = sp_OAMethod @Http, 'open', NULL, 'Get', @Url, false EXEC @Hr = sp_OAMethod @Http, 'setRequestHeader', NULL, 'Authorization', @Authorization EXEC @Hr = sp_OAMethod @Http, 'send', NULL, '';

    -- Auslesen der Rückgabe INSERT INTO @Result EXEC sp_OAGetProperty @Http, 'responseText'; SET @ResultString = ( SELECT TOP 1 content FROM @Result );
    -- Objekt wieder entsorgen
    EXEC @Hr = sp_OADestroy @Http; PRINT @ResultString;

    HTH


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    • Als Antwort markiert xela0099 Donnerstag, 30. Mai 2019 10:34
    Donnerstag, 30. Mai 2019 09:41
    Moderator

Alle Antworten

  • Hi,

    das kommt darauf an, welche Art der Authentifizierung gefordert wird.

    Schau dir das am besten erstmal außerhalb von SQL bspw. mit Fiddler an und prüfe, welche Daten in welcher Form dann vom Browser übergeben werden. Genau das musst Du dann in deinem Code nachbauen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Mittwoch, 29. Mai 2019 12:54
    Moderator
  • Hallo Stefan,

    Schon mal danke für die Antwort.

    Ich bin den ganzen Spaß bereits mit fiddler durchgegangen, jedoch bringt mich das nicht wirklich weiter.

    Ein Authorization-Header ist da, aber wie soll ich den vom SQL-Server aus übergeben?

    Authorization Header is present: Basic cmVzdDptb2J5ZGljaw==
    Decoded Username:Password= usr:pswrd
    

    Donnerstag, 30. Mai 2019 07:11
  • Hi,

    Basic Authorization wird in der Regel mit einem Base64 codierten String, der im Authorization Header übergeben wird, durchgeführt.

    Du musst daher zwei Dinge tun:

    1. Den Base64 String aus Benutzername:Passwort erzeugen.

    2. Dem Http Objekt sagen, dass dieser Wert im Authorization Header mitgegeben werden muss.

    DECLARE @UserData      varchar( 255 ) = 'testuser:testpwd';
    DECLARE @Authorization varchar( 255 );
    
    -- Umwandlung der Zugangsinformationen in Base64
    SELECT @Authorization = 'Basic ' + col
    FROM   OPENJSON
    (
        (
            SELECT col
            FROM   ( SELECT CAST( @UserData AS varbinary( MAX ) ) AS col ) T
            FOR    json auto
        )
    ) WITH( col varchar( max ) )
    
    DECLARE @Url          varchar( 255 ) = 'http://server/adresse';
    DECLARE @ResultString nvarchar( MAX );
    DECLARE @Result       table( content nvarchar( MAX ) );
    DECLARE @Hr           int;
    DECLARE @Http         int;
    
    -- Objekt für HttpRequest erzeugen, dessen Eigenschaften setzen und die Antwort auslesen EXEC @Hr = sp_OACreate 'WinHttp.WinHttpRequest.5.1', @Http OUT; EXEC @hr = sp_OAMethod @Http, 'open', NULL, 'Get', @Url, false EXEC @Hr = sp_OAMethod @Http, 'setRequestHeader', NULL, 'Authorization', @Authorization EXEC @Hr = sp_OAMethod @Http, 'send', NULL, '';

    -- Auslesen der Rückgabe INSERT INTO @Result EXEC sp_OAGetProperty @Http, 'responseText'; SET @ResultString = ( SELECT TOP 1 content FROM @Result );
    -- Objekt wieder entsorgen
    EXEC @Hr = sp_OADestroy @Http; PRINT @ResultString;

    HTH


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    • Als Antwort markiert xela0099 Donnerstag, 30. Mai 2019 10:34
    Donnerstag, 30. Mai 2019 09:41
    Moderator
  • Hi Stefan,

    Oh Gott, darauf wäre ich wohl nie gekommen! O.o

    Deine Lösung hat direkt beim ersten Versuch geklappt...besser könnte es garnicht sein!!!

    DANKE DANKE DANKE VIELMALS!!!!

    Donnerstag, 30. Mai 2019 10:39
  • Hi,

    kein Problem. Dafür sind wir ja da :)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Donnerstag, 30. Mai 2019 11:32
    Moderator