Community
    • Categories
    • Recent
    • Popular
    • Users
    • Search
    • Register
    • Login

    Authentifizierung JSON API

    Scheduled Pinned Locked Moved Betrieb
    11 Posts 4 Posters 2.4k Views 1 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • N Offline
      nklein
      last edited by

      Hallo,

      ich versuche gerade mich über die JSON API zu authentifizieren. Folgende Dinge habe ich bereits ausprobiert:

      Basic HTTP Authentication:

      Header:

      Content-Type: application/json
      Authorization: Basic dXNlcjpwYXNz
      
      

      Body:

      {
          "jsonrpc": "2.0",
          "method": "idoit.login",
          "params": 
        	{
              "apikey": "2aeouee7qu"
          },
          "id": 1
      }
      

      Response:

      {
      "jsonrpc": "2.0",
      "error": {
      "code": -32604,
      "message": "Authentication error",
      "data": {
      "error": "Please specify a user by RPC Session header or HTTP Basic Authentication."
      }
      },
      "id": 1
      }
      

      X-RPC Authentifizierung:

      Hier habe ich einmal versucht den Username und das Password gleichzeitig in einem Header zu übertragen oder zuerst nur den Usernamen. Beides hat nicht funktioniert.

      Header:

      Content-Type: application/json
      X-RPC-Auth-Username: user
      X-RPC-Auth-Password: pass
      
      

      Body:

      {
          "jsonrpc": "2.0",
          "method": "idoit.login",
          "params": 
        	{
              "apikey": "2aeouee7qu"
          },
          "id": 1
      }
      

      Response:

      {
      "jsonrpc": "2.0",
      "error": {
      "code": -32604,
      "message": "Authentication error",
      "data": {
      "error": "Please specify a user by RPC Session header or HTTP Basic Authentication."
      }
      },
      "id": 1
      }
      

      Das kann doch nicht so schwer sein, schließlich habe ich nirgends sonst jemanden gefunden der danach gefragt hat 😉 Ich würde mich freuen, wenn mir jemand für beide Anmeldemethoden jeweils ein Beispiel für Header und Body liefern könnte und mir auch noch sagt ob method.login überhaupt bei einer Anmeldung in den Body gehört (Lasse ich den Body komplett weg gibt es auch eine Fehlermeldung, daher habe ich die Methode Login als mMn sinnvollste genommen).

      Gruß,

      Niklas

      1 Reply Last reply Reply Quote 0
      • bheisigB Offline
        bheisig i-doit Team
        last edited by

        Hallo Niklas,

        willkommen im i-doit Forum!

        Einen Fehler habe ich nicht direkt entdecken können. Wahrscheinlich ist nur irgendwo ein kleiner Dreher drin. Mit dem User kommst du über die Web GUI ins System?

        Ein generelles Problem kann ich ausschließen. Mit meiner Library konnte ich mich anmelden.

        Request Header:

        
        POST /src/jsonrpc.php HTTP/1.1
        Host: demo.i-doit.com
        User-Agent: i-doit-api-client-php 0.2-dev
        Accept: */*
        Accept-Encoding: application/json
        Content-Type: application/json
        X-RPC-Auth-Username: admin
        X-RPC-Auth-Password: admin
        Content-Length: 92
        
        

        Request (JSON als PHP-Array):

        
        array(4) {
          'version' =>
          string(3) "2.0"
          'method' =>
          string(11) "idoit.login"
          'params' =>
          array(2) {
            'apikey' =>
            string(6) "c1ia5q"
            'language' =>
            string(2) "en"
          }
          'id' =>
          int(1)
        }
        
        

        Response Header (Ausschnitt):

        
        HTTP/1.1 200 OK
        Date: Thu, 23 Mar 2017 16:53:17 GMT
        Access-Control-Allow-Origin: *
        Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, X-RPC-Auth-Username, X-RPC-Auth-Password, X-RPC-Auth-Session
        Access-Control-Expose-Headers: X-RPC-Auth-Session
        X-RPC-Auth-Session: onndhb2pfd0t4rqvdhajkcnl40
        Content-Length: 242
        Content-Type: application/json
        
        

        Response (JSON als PHP-Array):

        
        array(8) {
          'result' =>
          bool(true)
          'userid' =>
          string(1) "9"
          'name' =>
          string(27) "i-doit Systemadministrator "
          'mail' =>
          string(22) "i-doit@acme-it.example"
          'username' =>
          string(5) "admin"
          'session-id' =>
          string(26) "onndhb2pfd0t4rqvdhajkcnl40"
          'client-id' =>
          string(1) "1"
          'client-name' =>
          string(17) "ACME IT Solutions"
        }
        
        

        Vielleicht hilft dir ein Blick hierauf weiter.

        Viele Grüße
        Benjamin

        1 Reply Last reply Reply Quote 0
        • N Offline
          nklein
          last edited by

          Hallo Benjamin,

          schon einmal vielen Dank für deine Hilfe, leider haben mich deine Beispiele nicht weiter gebracht. Wie da du ja auch schon gesagt hast sieht grundsätzlich bei meinem Header/Body alles gut aus.

          Ich habe mittlerweile noch ausprobiert ob es mit einem lokalen User funktioniert (Die User bis jetzt waren alle über LDAP), leider ohne Erfolg. Wenn ich die Authentifizierung allerdings serverseitig ausschalte kann ich die API problemlos verwenden.

          Ich habe mein Anliegen jetzt an den Advanced Support weitergegeben. Mal sehen was die dazu sagen.

          Gruß,

          Niklas

          1 Reply Last reply Reply Quote 0
          • U Offline
            ubruns
            last edited by

            Hallo nklein!

            So wie ich das aus den JSON-API Dokumentation lese, ist die Methode "idoit.login" nur für X-RPC Authentifizierung und nicht für "Basic" gedacht.

            Wenn du mit Basic arbeitest, wirst du vermutlich die Daten mit jedem Request einfach mitsenden müssen.
            Also die "Authorization: Basic dXNlcjpwYXNz" im Header bei jedem Aufruf von anderen Methoden mitsenden.

            Muss mir das später noch mal selber genau anschauen.

            Gruß
            Ulli Bruns

            1 Reply Last reply Reply Quote 0
            • F Offline
              franknagel
              last edited by

              Hallo,

              ich vermute, Sie betreiben i-doit mit FPM, dies wird allerdings offiziell nicht unterstützt. HTTP Basic Auth habe ich nie versucht im Zusammenhang mit der JSON-API, aber AUTH header werden aus Sicherheitsgründen oftmals nicht an das Skript durchgereicht. Hier kommt es auf die Konfiguration an. Es sollte allerdings auch gehen (vgl. src/classes/modules/api/controller/isys_api_controller.class.php "protected function apikey_login").

              X-RPC-Auth-Username und X-RPC-Auth-Password wiederum überleben das name mangling von CGI nicht: X-RPC-Auth-Username -> X_RPC_AUTH_USERNAME woraus idoit dann X-Rpc-Auth-Username macht, welches durch den Unterschied in der Groß-Klein-Schreibung nicht erkannt wird. Das zweite Problem ließe sich jedoch recht einfach lösen, falls Synetics sich entschließen würde, dass zu unterstützen (vgl. src/classes/core/isys_core.class.php "public static function headers()").

              Viele Grüße
              Frank Nagel

              1 Reply Last reply Reply Quote 0
              • bheisigB Offline
                bheisig i-doit Team
                last edited by

                In der Tat unterstützen wir derzeit Apache 2.4 mit mod_php, aber nicht FPM. Wenn Niklas die Theorie zu FPM bestätigen kann, nehmen wir das gerne als Feature Request auf.

                1 Reply Last reply Reply Quote 0
                • N Offline
                  nklein
                  last edited by

                  Hallo Herr Nagel,

                  Ich habe mal versucht nachzuprüfen ob bei uns PHP als Apache mod_php oder als CGI/FastCGI verwendet wird. Leider habe ich den Server nicht selbst aufgesetzt und weiß es daher nicht und habe auch keine Erfahrung mit PHP.

                  In der Liste installierter Pakete ist sowohl ein Paket für Apache als auch eines mit CGI aufgeführt.

                  libapache2-mod-php5/stable,now 5.6.30+dfsg-0+deb8u1 amd64 [installed]
                  libphp-pclzip/stable,now 2.8.2-3 all [installed]
                  php-pclzip/stable,now 2.8.2-3 all [installed,automatic]
                  php5/stable,now 5.6.30+dfsg-0+deb8u1 all [installed]
                  php5-cgi/stable,now 5.6.30+dfsg-0+deb8u1 amd64 [installed,automatic]
                  php5-cli/stable,now 5.6.30+dfsg-0+deb8u1 amd64 [installed]
                  php5-common/stable,now 5.6.30+dfsg-0+deb8u1 amd64 [installed,automatic]
                  php5-curl/stable,now 5.6.30+dfsg-0+deb8u1 amd64 [installed]
                  php5-gd/stable,now 5.6.30+dfsg-0+deb8u1 amd64 [installed]
                  php5-json/stable,now 1.3.6-1 amd64 [installed,automatic]
                  php5-ldap/stable,now 5.6.30+dfsg-0+deb8u1 amd64 [installed]
                  php5-mcrypt/stable,now 5.6.30+dfsg-0+deb8u1 amd64 [installed]
                  php5-memcache/stable,now 3.0.8-5 amd64 [installed]
                  php5-mysqlnd/stable,now 5.6.30+dfsg-0+deb8u1 amd64 [installed]
                  php5-pgsql/stable,now 5.6.30+dfsg-0+deb8u1 amd64 [installed]
                  php5-readline/stable,now 5.6.30+dfsg-0+deb8u1 amd64 [installed,automatic]
                  php5-snmp/stable,now 5.6.30+dfsg-0+deb8u1 amd64 [installed]
                  php5-xmlrpc/stable,now 5.6.30+dfsg-0+deb8u1 amd64 [installed]
                  

                  Um zu sehen was jetzt tatsächlich vom Webserver verwendet wird habe ich mir eine php-File mit der phpinfo()-Funktion angelegt, dabei kommt folgendes heraus:

                  System	Linux lx-idoit-demo 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u1 (2016-09-03) x86_64
                  Build Date	Feb 8 2017 08:50:48
                  Server API	Apache 2.0 Handler
                  Virtual Directory Support	disabled
                  Configuration File (php.ini) Path	/etc/php5/apache2
                  Loaded Configuration File	/etc/php5/apache2/php.ini
                  Scan this dir for additional .ini files	/etc/php5/apache2/conf.d
                  Additional .ini files parsed	/etc/php5/apache2/conf.d/05-opcache.ini, /etc/php5/apache2/conf.d/10-mysqlnd.ini, /etc/php5/apache2/conf.d/10-pdo.ini, /etc/php5/apache2/conf.d/20-curl.ini, /etc/php5/apache2/conf.d/20-gd.ini, /etc/php5/apache2/conf.d/20-json.ini, /etc/php5/apache2/conf.d/20-ldap.ini, /etc/php5/apache2/conf.d/20-mcrypt.ini, /etc/php5/apache2/conf.d/20-memcache.ini, /etc/php5/apache2/conf.d/20-mysql.ini, /etc/php5/apache2/conf.d/20-mysqli.ini, /etc/php5/apache2/conf.d/20-pdo_mysql.ini, /etc/php5/apache2/conf.d/20-pdo_pgsql.ini, /etc/php5/apache2/conf.d/20-pgsql.ini, /etc/php5/apache2/conf.d/20-readline.ini, /etc/php5/apache2/conf.d/20-snmp.ini, /etc/php5/apache2/conf.d/20-xmlrpc.ini
                  PHP API	20131106
                  PHP Extension	20131226
                  Zend Extension	220131226
                  Zend Extension Build	API220131226,NTS
                  PHP Extension Build	API20131226,NTS
                  Debug Build	no
                  Thread Safety	disabled
                  Zend Signal Handling	disabled
                  Zend Memory Manager	enabled
                  Zend Multibyte Support	provided by mbstring
                  IPv6 Support	enabled
                  DTrace Support	enabled
                  Registered PHP Streams	https, ftps, compress.zlib, compress.bzip2, php, file, glob, data, http, ftp, phar, zip
                  Registered Stream Socket Transports	tcp, udp, unix, udg, ssl, sslv3, tls, tlsv1.0, tlsv1.1, tlsv1.2
                  Registered Stream Filters	zlib.*, bzip2.*, convert.iconv.*, string.rot13, string.toupper, string.tolower, string.strip_tags, convert.*, consumed, dechunk, mcrypt.*, mdecrypt.*
                  

                  Ich interpretiere das so, dass Apache die PHP-Anfragen bearbeitet also php_mod verwendet wird, korrekt?

                  1 Reply Last reply Reply Quote 0
                  • F Offline
                    franknagel
                    last edited by

                    Die phpinfo zeigt für mich eindeutig, dass hier mod_php verwendet wird. Da Sie sowieso schon eine phpinfo anzeigen können, prüfen Sie doch mal was

                    curl -H 'X-RPC-Auth-Username: user' -H 'X-RPC-Auth-Password: pass' http://SERVER.NAME/phpinfo.php
                    

                    ergibt. Sowohl unter "Apache Environment" (HTTP_X_RPC_AUTH_USERNAME) als auch "HTTP Headers Information" (ohne name mangling) sollten diese beiden Felder auftauchen.

                    1 Reply Last reply Reply Quote 0
                    • N Offline
                      nklein
                      last edited by

                      Hallo,

                      ja das funktioniert auch soweit:

                      
                      ## Apache Environment
                      
                      | Variable | Value |
                      | HTTPS  | on  |
                      | SSL_TLS_SNI  | idoit-demo.sv.nr  |
                      | HTTP_HOST  | idoit-demo.sv.nr  |
                      | CONTENT_TYPE  | application  |
                      | HTTP_X_RPC_AUTH_USERNAME  | api_user  |
                      | HTTP_X_RPC_AUTH_PASSWORD  | api_pass  |
                      | HTTP_COOKIE  | PHPSESSID=l7974pvji93s10n7qinmpvhsf0  |
                      | CONTENT_LENGTH  | 0  |
                      | PATH  | /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin  |
                      | SERVER_SIGNATURE  | <address>Apache/2.4.10 (Debian) Server at idoit-demo.sv.nr Port 443</address> |
                      
                      
                      1 Reply Last reply Reply Quote 0
                      • F Offline
                        franknagel
                        last edited by

                        Was verhält sich denn

                        curl -H 'Content-Type: application/json' -H 'X-RPC-Auth-Username: USERNAME' -H 'X-RPC-Auth-Password: PASSWORD' http://SERVER.NAME/src/jsonrpc.php \
                        --data-ascii '{"version": "2.0","params": {"apikey": "APIKEY"}, "id": "1", "method": "idoit.login" }'
                        

                        mit den VIER angepassten Werten? Das sollte eine Erfolgsmeldung samt session-id zurückliefern.

                        1 Reply Last reply Reply Quote 0
                        • N Offline
                          nklein
                          last edited by

                          Ich denke ich habe das Problem gefunden. Ich habe bis jetzt für alle Requests den Advanced REST Client als Chrome-Erweiterung verwendet. Dieser scheint mit der Authentifizierung über X-RPC nicht zusammenzuarbeiten. Sobald ich den Befehl

                          curl -H 'Content-Type: application/json' -H 'X-RPC-Auth-Username: api_user' -H 'X-RPC-Auth-Password: api_pass' http://idoit-demo.sv.nr/idoit/src/jsonrpc.php \
                          --data-ascii '{"version": "2.0","params": {"apikey": "fqq6cqd50"}, "id": "1", "method": "idoit.login" }'
                          

                          per curl aus einem Linux-Terminal verschicke bekomme ich eine Session-ID zurück…

                          Schon etwas komisch, da mein REST Client wunderbar mit der JSON-Schnittstelle reden kann, WENN die Authentifizierung serverseitig ausgeschaltet ist.

                          Ich bedanke mich hiermit bei allen Beteiligten für die Unterstützung!

                          Gruß,

                          Niklas Klein

                          1 Reply Last reply Reply Quote 0
                          • First post
                            Last post