ein curl-Abruf funktioniert nicht mehr

Hänge mal die beiden DigiCert CA Zertifikate auch an die IPS cacert.pem an und starte IPS neu. Das *.dyson Zertifikat ist eigentlich an der Stelle falsch, weil das kein CA Zertifikat ist. Sollte aber auch nicht stören.

Hallo,

habe ich gemacht, von der o.g. Seite im Firefox sowohl das DigiCert Global Root CA als auch das DigiCert SHA2 Secure Server CA heruntergeladen und in /ustr/share/symcon/cacert.pem eingetragen, IPS gestartet.

Leider kein Erfolg.

Die beiden Zertifikate waren übriges bereits schon in cacert.pem vorhanden

Habe alle 3 Zertifikat wieder entfernt …

demel

Hm, eigentlich sollte das aber tun.
Auf meinem IPS raspberry mit openssl getestet.
Initial ist die Verbindung fehlerhaft


/usr/share/symcon> openssl s_client  -connect appapi.cp.dyson.com:443 -CAfile ./cacert.pem
....
Verify return code: 21 (unable to verify the first certificate)

Ich habe dann nur das Digicert SHA2 CA Zertifikat ans Ende dazu getan


-----BEGIN CERTIFICATE-----
MIIElDCCA3ygAwIBAgIQAf2j627KdciIQ4tyS8+8kTANBgkqhkiG9w0BAQsFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0xMzAzMDgxMjAwMDBaFw0yMzAzMDgxMjAwMDBaME0xCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxJzAlBgNVBAMTHkRpZ2lDZXJ0IFNIQTIg
U2VjdXJlIFNlcnZlciBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
ANyuWJBNwcQwFZA1W248ghX1LFy949v/cUP6ZCWA1O4Yok3wZtAKc24RmDYXZK83
nf36QYSvx6+M/hpzTc8zl5CilodTgyu5pnVILR1WN3vaMTIa16yrBvSqXUu3R0bd
KpPDkC55gIDvEwRqFDu1m5K+wgdlTvza/P96rtxcflUxDOg5B6TXvi/TC2rSsd9f
/ld0Uzs1gN2ujkSYs58O09rg1/RrKatEp0tYhG2SS4HD2nOLEpdIkARFdRrdNzGX
kujNVA075ME/OV4uuPNcfhCOhkEAjUVmR7ChZc6gqikJTvOX6+guqw9ypzAO+sf0
/RR3w6RbKFfCs/mC/bdFWJsCAwEAAaOCAVowggFWMBIGA1UdEwEB/wQIMAYBAf8C
AQAwDgYDVR0PAQH/BAQDAgGGMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYY
aHR0cDovL29jc3AuZGlnaWNlcnQuY29tMHsGA1UdHwR0MHIwN6A1oDOGMWh0dHA6
Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RDQS5jcmwwN6A1
oDOGMWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RD
QS5jcmwwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8v
d3d3LmRpZ2ljZXJ0LmNvbS9DUFMwHQYDVR0OBBYEFA+AYRyCMWHVLyjnjUY4tCzh
xtniMB8GA1UdIwQYMBaAFAPeUDVW0Uy7ZvCj4hsbw5eyPdFVMA0GCSqGSIb3DQEB
CwUAA4IBAQAjPt9L0jFCpbZ+QlwaRMxp0Wi0XUvgBCFsS+JtzLHgl4+mUwnNqipl
5TlPHoOlblyYoiQm5vuh7ZPHLgLGTUq/sELfeNqzqPlt/yGFUzZgTHbO7Djc1lGA
8MXW5dRNJ2Srm8c+cftIl7gzbckTB+6WohsYFfZcTEDts8Ls/3HB40f/1LkAtDdC
2iDJ6m6K7hQGrn2iWZiIqBtvLfTyyRRfJs8sjX7tN8Cp1Tm5gr8ZDOo0rwAhaPit
c+LJMto4JQtV05od8GiG7S5BNO98pVAdvzr508EIDObtHopYJeS4d60tbvVS3bR0
j6tJLp07kzQoH3jOlOrHvdPJbRzeXDLz
-----END CERTIFICATE-----


 /usr/share/symcon> openssl s_client  -connect appapi.cp.dyson.com:443 -CAfile ./cacert.pem
...
Verify return code: 0 (ok)


Deinen PHP Code konnte ich natürlich mangels eigenen Account nicht testen

Hallo,

für den Code brauchst Du keinen Account, denn es kommt dann eine json-codierte Fehlermeldung, wenn zB der User nicht bekannt ist. Hier kommt aber ja ein http-code 403.

Ich habe aber das Gefühl, das die Diskussion, auch die Antwort von paresy, sich nur mit dem Aspekt des SSL-Zertifikates auseinander setzt. Das Problem hatte ich erst umgangen, indem ich die SSL-Prüfung deaktiviert hatte, später hatte ich ja das DigiCert SHA2 Secure Server CA bereits hinzugefügt und konnte so auf CURLOPT_SSL_VERIFYPEER verzichten.

Trotzdem kommt ja nicht die gleiche Antwort wie bei dem shell-curl Aufruf.

demel

Hm, 403 ist „verboten“ (falscher User, falsches Password, falscher Client…)
https://developer.mozilla.org/de/docs/Web/HTTP/Status/403

Hallo,
hast du mal den Useragent getestet, den mit curl, php-curl verglichen? z.B in simpel mit dieser Seite: https://ifconfig.me/ua
Enthält das Passwort vielleicht Sonderzeichen, die PHP bei der Übergabe an CURL miss-interpretiert?

Hallo,

naja, das 403 Forbidden bedeutet, ist ja klar (siehe mein erster post), aber hier wird offensichtlich die Authentifizierung anders zurückgemeldet

bei korrektem Aufruf

curl -X POST -H "Content-Type: application/json" -k 'https://appapi.cp.dyson.com/v1/userregistration/authenticate?country=DE' -d '{"Email": "maine_mailadresse", "Password": "mein_password"}'

ergibt diese Antwort

{„Account“:„xxxx-yyyy-zzzz“,„Password“:„lwglhglhwlhg=⇔“}

curl -X POST -H "Content-Type: application/json" -k 'https://appapi.cp.dyson.com/v1/userregistration/authenticate?country=DE' -d '{"Email": "unbekannter__user", "Password": "falsches_passwort"}'

ergibt das

{„Message“:„Unable to authenticate user.“}

demel

Das mit dem User-Agent hatte ich nicht nicht probiert, mache es gleich mal. Ich bin jetzt erstmal gesperrt (4 Fehlversuche = 30 Minuten Sperre).
Ich hatte bislang kein User-Agent im Header.

Den Header hole ich mir immer so raus

curl_setopt($ch, CURLINFO_HEADER_OUT, true); 
...
echo 'CURLINFO_HEADER_OUT=' . curl_getinfo($ch, CURLINFO_HEADER_OUT) . PHP_EOL; 

Was mache diese URL, gibt man die einfach auf URL in dem curl-Auftruf an?

Nein, enthält nicht, aber ich hatte das PW testhalber mal aus 1234567 geändert -> ohne Erfolg.

gruß
demel

Die von mir verlinkte URL zeigt einfach nur als Text den User-Agent an. Ohne irgendwelche Abfragen „welchen Useragent könnte ich verwenden“. Wenn du sie mal in den Browser kopierst, wirst du das Ergebnis sehen. Das dann mal mit php und mit curl, dann siehst recht schnell die beiden eingesetzten User Agents.

Schau mal hier : Login to Dyson account failed: '403, Forbidden' · Issue #21 · JanJaapKo/DysonPureLink · GitHub
Das ist geanu das, was Tobias (und ich mit „Client“) meinte

<Edit>
Hier übrigens auch: adding headers that Dyson API now requires · lukasroegner/homebridge-dyson-pure-cool@a77a52d · GitHub

Hallo,

der fehlende User-Agent war’s, den scheint die Dyson-API jetzt zu erwarten, wobei egal zu sein scheint, was drin steht.
Ja, das steht ja auch in dem Link zu homebridge-dyson-pure-cool/, den Du gepostet hattest

Da bin ich leider überhaupt nicht drauf gekommen, das das Modul schon seit 1 1/2 Monaten ohne diese Angabe im Header funktionier. :banghead::banghead:

Tja, jetzt bin ich schlauer.

Vielen Dank für eure Hilfe
demel

Hallo Demel,

ich habe jetzt das Problem wie in deinem Thread beschrieben, kann man irgendwas machen damit es wieder geht? (siehe Bild)

Vielen Dank!
Gruß Robert

Hallo,

ja, ich sehe das gerade bei mir auch. Und bei schneller Suche in Internet sehe ich leider auch, das Dyson die Anmelde-Prozedur wieder mal komplett umgestellt hat.
Man bekommt nun beim Login in der App nach Eingabe der Mail-Adresse (= Benutzerkennung) per Mail ein Code zugeschickt, den man mit dem Passwort eingeben muss.

Wie doof … da muss ich überlegen, wie ich das in abbilden kann.

In den bereits oben erwähnten Repositories DysonPureLink/account.py at master · JanJaapKo/DysonPureLink · GitHub und GitHub - lukasroegner/homebridge-dyson-pure-cool: Plugin for using the Dyson Pure Cool fans in homebridge. gibt es ja schon eine Implementierung.

Wird aber leider etwas dauern, bis ich da eine Lösung habe, in 2 Wochen habe ich Urlaub und kann spätestens dann dran arbeiten.

demel

Hallo Demel,

wollte mal fragen ob Du schon Zeit gefunden hast?

Viele Grüße Robert

hi,

bin gerade im urlaubsort angekommen und wollte mich morgen damit beschäftigen. hatte mir das zwischenzeitlich nochmal angeschaut und habe auch überlegt wie ich es machen will

gruss
demel

Hallo,
leider gibt es bisher keine guten Nachrichten. Ich habe mal die gesammelten Erkenntnisse aus meinen Recherchen im Internet probiert, bekommen aber schon bei der Anfrage des Userstatus (https://appapi.cp.dyson.com/v3/userregistration/email/userstatus) ein „Unable to authenticate user.“

z.B.

Ich versuche es natürlich weiter…
demel

Hallo,

leider bekomme ich es weiterhin nicht hin, ich bekomme immer ein HTTP-Error 401 mit der Meldung „Unable to authenticate user.“.

Ich habe extra einen neuen Account eingerichtet, es mit unterschiedlichen IP’s probiert und auch Module anderer Systeme ausprobiert - immer mit dem gleichen Misserfolg.

Grundsätzlich muss es aber richtig sein, denn ich habe einmal (!) die korrekte Antwort bekommen, dann die Mail mit dem OneTime-Code erhalten und konnte den Token abrufen … aber das funktionierte genau einmal.

Kannst Du mal das Script mal bitte ausprobieren mit Deiner email und password?

<?php

declare(strict_types=1);

$email = '<uuu.domain.tdl>';
$password = 'xxx';
$country = 'DE';

$api_host = 'https://appapi.cp.dyson.com';

$url = $api_host . '/v3/userregistration/email/userstatus?country=' . $country;

$postdata = [
    'Email' => $email,
];

// $user_agent = 'Dalvik/2.1.0 (Linux; U; Android 6.0; Android SDK built for x86_64 Build/MASTER)';
$user_agent = 'Dalvik/2.1.0 (Linux; U; Android 8.1.0; Google Build/OPM6.171019.030.E1)';

$headers = [
    'User-Agent: ' . $user_agent,
    'Accept: */*',
    'Content-Type: application/json',
];

echo 'url=' . $url . PHP_EOL;
echo 'headers=' . print_r($headers, true) . PHP_EOL;
echo 'postdata=' . json_encode($postdata) . PHP_EOL;

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postdata));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);

$cdata = curl_exec($ch);
$cerrno = curl_errno($ch);
$cerror = $cerrno ? curl_error($ch) : '';
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

curl_close($ch);

echo 'cerrno=' . $cerrno, '(' . $cerror . '), httpcode=' . $httpcode . ', cdata=' . $cdata . PHP_EOL;

gruß
demel

Hi Demel,

schaut nicht gut aus:

url=https://appapi.cp.dyson.com/v3/userregistration/email/userstatus?country=DE
headers=Array
(
    [0] => User-Agent: Dalvik/2.1.0 (Linux; U; Android 8.1.0; Google Build/OPM6.171019.030.E1)
    [1] => Accept: */*
    [2] => Content-Type: application/json
)

postdata={"Email":"meine@mail.de"}
cerrno=0(), httpcode=401, cdata={"Message":"Unable to authenticate user."}

Hallo,

mach mal folgendes:

  1. in der Dyson-App abmelden
  2. wieder beginnen anzumelden, also Land und Mail-Adresse angeben → dann kommt die Eingabe von Passwort und Code: NICHT eingeben
  3. das og. Script aufrufen

es müsste eine anderen Antwort kommen

„accountStatus“:„ACTIVE“,„authenticationMethod“:„EMAIL_PWD_2FA“

Wichtig ist dabei nach meinen bisherigen Erkenntnissen, das sich das Mobilgerät mit der Dyson-App mit der gleichen IP-Adresse wie IPS bei Dyson meldet - sprich das Handy muss im lokalen WLAN arbeiten.

Wenn das reproduzierbar ist, kann ich den weiteren 2FA-Login-Prozess implementieren

demel

@rtausend

Hallo,

hast du den Test schon machen können?

Bei mir habe ich den Ablauf der http-Calls soweit machen können, das ich so ein Token bekommen habe.
Der Hack mit der Dyson-App ist besonders zu Test ein bisschen lästig und ein paar mal ein Fehler gemacht und Dyson sperrt das Konto für einige Zeit.

gruß
demel