HTTPMOD: Benutzername und Passwort

Begonnen von RoBra81, 17 April 2015, 14:12:26

Vorheriges Thema - Nächstes Thema

RoBra81

Hallo,

ich würde gern HTTPMOD nutzen, um meine Wechselsprechanlage zu bedienen. Um aber ein gewisses Maß an Sicherheit zu haben, würde ich gern die Authentifizierung aktivieren. Wenn diese aktiviert ist, geht z.B. beim Aufruf der Statusseite im Browser ein (Browser-)Fenster auf, welches nach Nutzername und Passwort fragt. Leider verstehe ich anhand der Beispiele in der Commandref nicht, wie ich es hinbekomme, diese über HTTPMOD bereitszustellen.

Mein HTTPMOD sieht zur Zeit so aus:

define Klingel.IF HTTPMOD http://192.168.18.8/api 30000000\

attr Klingel.IF get001Data {"get" :{""}}
attr Klingel.IF get001Header Content-Type: application/json
attr Klingel.IF get001Name SystemInfo
attr Klingel.IF get001URL http://192.168.18.8/api/system/info
attr Klingel.IF get002Data {"get" :{""}}
attr Klingel.IF get002Header Content-Type: application/json
attr Klingel.IF get002Name SystemStatus
attr Klingel.IF get002URL https://192.168.18.8/api/system/status
attr Klingel.IF userattr get001Data get001Header get001Name get001URL get002Data get002Header get002Name get002URL sid01URL sid02URL verbose
attr Klingel.IF verbose 5


Wenn ich ein get SystemStatus mache, erhalte ich folgende Einträge im Log:

2015.04.17 14:01:12 5: Klingel.IF: get called with SystemStatus
2015.04.17 14:01:12 5: Klingel.IF: get found option SystemStatus in attribute get002Name
2015.04.17 14:01:12 4: Klingel.IF: get will now request SystemStatus
2015.04.17 14:01:12 5: Klingel.IF: AddToQueue called, initial send queue length : 0
2015.04.17 14:01:12 5: Klingel.IF: AddToQueue adds type Get002 to URL https://192.168.18.8/api/system/status, data {"get" :{""}}, header Content-Type: application/json
2015.04.17 14:01:12 5: Klingel.IF: HandleSendQueue called, qlen = 1
2015.04.17 14:01:12 4: Klingel.IF: HandleSendQueue sends request type Get002 to URL https://192.168.18.8/api/system/status, data {"get" :{""}}, header Content-Type: application/json, timeout 2
2015.04.17 14:01:12 4: HttpUtils url=https://192.168.18.8/api/system/status
2015.04.17 14:01:12 4: https://192.168.18.8/api/system/status: HTTP response code 401
2015.04.17 14:01:12 4: HttpUtils https://192.168.18.8/api/system/status: Got data, length: 109
2015.04.17 14:01:12 5: Klingel.IF: Read Callback: Request type was Get002,
header: HTTP/1.1 401 Unauthorized
Server: HIP2.11.1.20.4
WWW-Authenticate: Basic realm="`^9�u^9�댃댃Basic realm=""
WWW-Authenticate: Digest realm="HTTP API (1/00000001)", nonce="01c4456b805e945359ae08182b45997b", qop="auth"
Content-Type: application/json
Content-Length: 109,
buffer: {
  "success" : false,
  "error" : {
    "code" : 9,
    "description" : "authorization required"
  }
}
2015.04.17 14:01:12 5: Klingel.IF: Read is extracting Reading with  from HTTP Response to Get002
2015.04.17 14:01:12 5: Klingel.IF: Read starts extracting all Readings from HTTP Response to Get002
2015.04.17 14:01:12 3: Klingel.IF: Read response to Get002 didn't match any Reading(s)
2015.04.17 14:01:12 5: Klingel.IF: HandleSendQueue called, qlen = 0


Was muss ich noch machen, damit es mit Nutzername und Passwort funktioniert?

Ronny

moonsorrox

ich hatte das Problem ebenfalls mal mit einer Webcam. Selbst die Eintragung in der Kamera mit cgi Pfad funktionierte nicht...!
Welchen Port nutzt du..?

Falls ich dich richtig verstanden habe, evtl. sind das aber zwei verschieden Dinge..!

Dieser Fehler 401 im Klartext ist ein Client Fehler, du bist "Unauthorized" is ja logisch...!
ZitatDie Anfrage kann nicht ohne gültige Authentifizierung durchgeführt werden. Wie die Authentifizierung durchgeführt werden soll, wird im ,,WWW-Authenticate"-Header-Feld der Antwort übermittelt.

Zur Erklärung was ich gemacht habe:
ich habe diese Meldung über eine lokale IP + extra Port geschickt, da ja die FHEM Ports bei mir alle mit User und Passwort gesichert sind und das funktionierte eben nicht...

Vielleicht hilft es dir weiter..!  ;)
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

RoBra81

Leider nicht wirklich - ich muss ja dem HTTPMOD erstmal irgendwie Benutzernamen und Passwort die für die Wechselsprechanlage benötigt werden mitteilen und da weiß ich nicht wirklich, wie...

StefanStrobel

Hallo Ronny,

Wenn Dein Gerät Basic Authentication akzeptiert und keine Session-ID verwendet, kannst Du versuchen Benutzername:Passwort@ vor die IP-Adresse in der URL zu setzen. Die HttpUtils, die HTTPMOD verwendet, machen daraus dann einen passenden Basic Auth Header.

Z.B.

attr Klingel.IF get001URL http://Ronny:geheim@192.168.18.8/api/system/info



Gruß
     Stefan

Sidey

Hallo,

ich habe ein sehr ähnliches Problem.
Wollte httpmod gerade verwenden um eine API eines Dienstes abzurufen...

Am Dienst muss ich mich mit digest Authentication anmelden, aber das klappt nicht.

Wie muss ich die Header setzen, damit das klappt?


Grüße Sidey
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem,zigbee2mqtt

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

StefanStrobel

Hallo Sidey,

HTTPMOD verwendet HttpUtils. Da ist Basic Auth implementiert. Digest Auth leider bisher nicht.
Eigentlich sollte das aber nicht schwer sein (könnte ähnlich wie Redirects in HttpUtils implementiert werden: 401 abfangen, nonce extrahieren und wie beim redirect weiter machen, dann aber nicht einfach das Passwort als Base64 sondern das Ergebnis der Hash-Berechnung senden...)
Form basiertes Auth mit Session IDs habe ich in HTTPMOD implementiert.

Momentan hab ich leider zu wenig Zeit um hier einen Patch vorzuschlagen.

Gruss
    Stefan

Volker_

Zitat von: StefanStrobel am 19 April 2015, 14:27:47
Hallo Ronny,

Wenn Dein Gerät Basic Authentication akzeptiert und keine Session-ID verwendet, kannst Du versuchen Benutzername:Passwort@ vor die IP-Adresse in der URL zu setzen. Die HttpUtils, die HTTPMOD verwendet, machen daraus dann einen passenden Basic Auth Header.

Z.B.

attr Klingel.IF get001URL http://Ronny:geheim@192.168.18.8/api/system/info



Gruß
     Stefan
Hallo,
wenn ich bei diesem Format im Passwort einen Doppelpunkt habe (abc:def) bekomme ich als Fehlermeldung:
HTTPMOD got error in callback: http://user:abc:def@site.de/introduction.htm: malformed or unsupported URL
Gibt es hier eine quote oder escape Möglichkeit?

Grüße, Volker

StefanStrobel

Hi Volker,

das ist in HttpUtils bisher nicht drin.
HttpUtils_Connect beginnt recht direkt mit

  if($hash->{url} !~
           /^(http|https):\/\/(([^:\/]+):([^:\/]+)@)?([^:\/]+)(:\d+)?(\/.*)$/) {
    return "$hash->{displayurl}: malformed or unsupported URL";
  }


Gruss
     Stefan