Benutzer mit den meisten Antworten
Authentifizierung bei Webservice (Promt)

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?
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
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 -
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
-
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
-
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