theexplainertheexplainer MemberComments: 39 Received thanks: 1 Member since: January 2012 edited June 2014
Hi,
vielleicht kann mir jemand helfen,
ich hab mal versucht das Rest-Api Tutorial nachzuvollziehen, leider henge ich schon bei der Authentifizierung, die aber laut meinem Server-Admin alle Voraussetzungen hat.
Mein Skript:
<?php
if (isset($_SERVER['Authorization'])) {
        $auth = preg_split('/\s+/', trim($_SERVER['Authorization']));
        if (strtolower($auth[0]) == 'basic' && count($auth) >= 2) {
                $data = explode(":", base64_decode($auth[1]));
                if (count($data) >= 2) {
                        $_SERVER['PHP_AUTH_USER'] = array_shift($data);
                        $_SERVER['PHP_AUTH_PW'] = join(':', $data);
                }
        }
}
class ApiClient
{
    const METHODE_GET    = 'GET';
    const METHODE_PUT    = 'PUT';
    const METHODE_POST   = 'POST';
    const METHODE_DELETE = 'DELETE';

    protected $validMethods = array(
        self::METHODE_GET,
        self::METHODE_PUT,
        self::METHODE_POST,
        self::METHODE_DELETE
    );

    protected $apiUrl;
    protected $cURL;

    public function __construct($apiUrl, $username, $apiKey)
    {
        $this->apiUrl = substr($apiUrl, -1) != '/' ? $apiUrl . '/' : $apiUrl;

        //Initializes the cURL instance
        $this->cURL = curl_init();
        curl_setopt($this->cURL, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($this->cURL, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
        curl_setopt($this->cURL, CURLOPT_USERPWD, $username . ':' . $apiKey);
        curl_setopt($this->cURL, CURLOPT_HTTPHEADER, array(
            'Content-Type: application/json; charset=utf-8',
        ));
    }

    public function call($url, $method = self::METHODE_GET, $data = array())
    {
        if (!in_array($method, $this->validMethods)) {
            throw new Exception('Invalid HTTP-Methode: ' . $method);
        }

        $dataString = json_encode($data);

        curl_setopt($this->cURL, CURLOPT_URL, $this->apiUrl . $url);
        curl_setopt($this->cURL, CURLOPT_CUSTOMREQUEST, $method);
        curl_setopt($this->cURL, CURLOPT_POSTFIELDS, $dataString);

        $result   = curl_exec($this->cURL);
        $httpCode = curl_getinfo($this->cURL, CURLINFO_HTTP_CODE);

        return $this->prepareResponse($result, $httpCode);
    }

    protected function prepareResponse($result, $httpCode)
    {
        echo "<h2>HTTP: $httpCode</h2>";

        if (null === $decodedResult = json_decode($result, true)) {
            $jsonErrors = array(
                JSON_ERROR_NONE => 'Es ist kein Fehler aufgetreten',
                JSON_ERROR_DEPTH => 'Die maximale Stacktiefe wurde erreicht',
                JSON_ERROR_CTRL_CHAR => 'Steuerzeichenfehler, möglicherweise fehlerhaft kodiert',
                JSON_ERROR_SYNTAX => 'Syntaxfehler',
            );

            echo "<h2>Could not decode json</h2>";
            echo "json_last_error: " . $jsonErrors[json_last_error()];
            echo "<br>Raw:<br>";
            echo "<pre>" . print_r($result, true) . "</pre>";

                return;
        }

        if (!isset($decodedResult['success'])) {
            echo "Invalid Response";
            return;
        }

        if (!$decodedResult['success']) {
            echo "<h2>No Success</h2>";
            echo "<p>" . $decodedResult['message'] . "</p>";
            return;
        }

        echo "<h2>Success</h2>";
        if (isset($decodedResult['data'])) {
            echo "<pre>" . print_r($decodedResult['data'], true) . "</pre>";
        }

        return $decodedResult;
    }
}
$client = new ApiClient(
    //URL des Shopware Rest Servers
    'http://www.webshop-programmierung.at/api',
    //Benutzername
    'ds',
    //API-Key des Benutzers
    'xxxxxxxxxxxxxxxxxxxxx'
);
$client->call('articles/3', ApiClient::METHODE_GET);
echo $client;
?>
und hier die Fehlermeldung:

HTTP: 401
No Success
Invalid or missing auth

Beim direkten Aufruf über die URL komm ich auch nicht über die Passworteingabe hinaus.

Comments

  • ottschoottscho MemberComments: 2592 Received thanks: 260 Member since: October 2010
    Habe nun das gleiche Problem. Konntest du es zu deiner Zeit lösen?
  • bui_akbui_ak MemberComments: 125 Received thanks: 9 Member since: November 2011
    funktioniert bei mir ohne probleme in 403.
    $client = new ApiClient(
        //URL des Shopware Rest Servers
        'http://bui-shopware-dev.de/WEB/shopware/4/api/',
        //Benutzername
        'admin',
        //API-Key des Benutzers
        '3xcLdu1ul5Eplybm2Kv3m8JP7mgJJke2uSw85adz'
    );
    print_r ($client->call('articles/2', ApiClient::METHODE_GET))
    
    allerdings habe ich das
    if (isset($_SERVER['Authorization']))
    ...
    
    weggelassen.
  • ottschoottscho MemberComments: 2592 Received thanks: 260 edited November 2012 Member since: October 2010
    Muss bei mir an der Shopware-Installation liegen.

    Selbst http://www.meineDomain.de/api funktioniert nicht.
    Es kommt die Authentifizierung ich gebe den im Backend angelegten API User und Key ein, aber der Benutzer wird nicht angenommen.
  • bui_akbui_ak MemberComments: 125 Received thanks: 9 Member since: November 2011
    ist der evntl. nicht in der gruppe local_admins ?
  • ottschoottscho MemberComments: 2592 Received thanks: 260 Member since: October 2010
    Doch ist er. Habe auch extra noch einen neuen Benutzer angelegt.
  • bui_akbui_ak MemberComments: 125 Received thanks: 9 Member since: November 2011
    dann debugge doch mal ein bisschen in engine/Shopware/Plugins/Default/Core/RestApi/Bootstrap.php::onFrontPreDispatch()
  • ottschoottscho MemberComments: 2592 Received thanks: 260 Member since: October 2010
    Also hier habe ich das Problem:

    $identity = $result->getIdentity();

    Das Ganze für mich nun zur engine/Shopware/Components/Auth/Adapter/default.php
    Leider blick ich hier nicht wirklich durch.
  • bui_akbui_ak MemberComments: 125 Received thanks: 9 Member since: November 2011
    der benutzer muss übrigens auch aktiviert sein...

    ich blick' da bei dieser massigen vererbung und $this->_adapter
    auch nicht durch, zumal es bei mir ja auch funktioniert.
    evntl. liegts an der php/mysql version?


    hier: PHP 5.4.6/5.5.28 jeweils ubuntu x64
  • ottschoottscho MemberComments: 2592 Received thanks: 260 Member since: October 2010
    Server ist DF und MYSQL 5.1.60

    Hatte vorhin erst von SW4.0 auf SW4.0.3 geupdatet.
    Evtl. muss ich den Shop mal neu aufziehen... :(

    uWamp hatte bei mir zuletzt auch funktioniert.
  • bui_akbui_ak MemberComments: 125 Received thanks: 9 Member since: November 2011
    ottscho wrote:
    Evtl. muss ich den Shop mal neu aufziehen... :(
    das kann gut sein. ich selbst habe noch keine updates vorgenommen, sondern immer den shop neu installiert. aber ich bin ja auch kein shop-betreiber sondern "nur" programmierer :)

    naja, berichte mal ob das geholfen hat.
  • ottschoottscho MemberComments: 2592 Received thanks: 260 Member since: October 2010
    so, jetzt weiß ich das es am Server liegt.
    DF verwendet fastcgi.

    nun habe ich in die htaccess wie im Tutorial beschrieben diese Zeilen eingefügt:
    <IfModule mod_fastcgi.c>
        AddHandler php5-fcgi .php
        Action php5-fcgi /php5-fcgi
        Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
        FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -host 127.0.0.1:9000 -pass-header Authorization
    </IfModule>
    
    Leider ohne Erfolg.

    Verwendet von euch jemand Domainfactory und hat die REST API am Laufen?
  • ottschoottscho MemberComments: 2592 Received thanks: 260 Member since: October 2010
    doch kein FastCGI, so langsam blick ich es nicht mehr...
    ist schon zu spät.
  • ottschoottscho MemberComments: 2592 Received thanks: 260 Member since: October 2010
    Moin,

    ich habe nun den ganzen Shop komplett neu aufgesetzt.
    Leider ohne Erfolg. Mein Problem bleibt bestehen...

    Hat jemand eine Idee? Gibt es auf User, welcher bei DF sind und können dies mal testen?

    Danke
  • ottschoottscho MemberComments: 2592 Received thanks: 260 Member since: October 2010
    Problem ist gelöst danke DF Support.

    Folgendes muss in die .htaccess eingefügt werden.

    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]


    Dann klappt das auch :)

    Shopware, evtl könnte ihr dies in das Tutorial aufnehmen.
    Danke
    Thanked by 1bkraemer
  • radoxradox MemberComments: 379 Received thanks: 39 Member since: December 2010
    Aber nur wenn PHP über CGI eingebunden ist. ;)
  • André KAndré K MemberComments: 161 Received thanks: 21 Member since: November 2013
    Hallo Ottscho,

    hattest Du später noch einmal Probleme mit d)f?
    Nutzt Du php 5.49 fastcgi bei d)f (im Admin-Panel kann die Version und Standard, fastcgi etc. gewählt werden)?
    Mit Standard geht es bei mir, mit fastcgi nicht.

    Danke
    André
  • ottschoottscho MemberComments: 2592 Received thanks: 260 Member since: October 2010
    Nein, ich hatte keine Probleme mehr. Aber nutze es auch nicht ständig.
    Thanked by 1André K
  • André KAndré K MemberComments: 161 Received thanks: 21 Member since: November 2013
    Der Vollständigkeit halber:
    Die API läuft mit der Shopware-Version 4.2.1 bei d)f auch unter fastcgi einwandfrei.
  • bkraemerbkraemer MemberComments: 8 Received thanks: 2 Member since: March 2014
    ottscho wrote:
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    DANKE!!! Auch wenn der Post schon einige Zeit her ist. Dank Google bin ich darauf gestoßen und es war die richtige Lösung!

    Danke!!!!!!! :-)
  • KevinS86KevinS86 MemberComments: 191 Received thanks: 47 Member since: July 2016
    ottscho schrieb:
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    DANKE!!! Auch wenn der Post schon einige Zeit her ist. Dank Google bin ich darauf gestoßen und es war die richtige Lösung!

    Danke!!!!!!! :-)

    Ich kann selbst nach nochmals 2 Jahren vielen Dank für die Lösung sagen :) 

    Hat mich gerade auch gerettet :P 

    Wünsche vorab alle ein schönes WE!

    Liebe Grüße

    Kevin

     

  • KMUdoKMUdo MemberComments: 53 Received thanks: 7 edited September 2016 Member since: June 2014

    Momentan stehe ich vor demselben Problem.

    Wo genau im .htaccess sollte diese Zeile hinzugefügt werden?
    Es gibt ja bereits folgendes:

    # Fix missing authorization-header on fast_cgi installations
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]

    Wenn ich dies mit dem hier besprochenen ersetze, oder oberhalb/unterhalb hinzufüge, klappt es leider immer noch nicht.

  • matthiasftlmatthiasftl MemberComments: 329 Received thanks: 49 edited September 2016 Member since: April 2015

    Momentan stehe ich vor demselben Problem.

    Wo genau im .htaccess sollte diese Zeile hinzugefügt werden?
    Es gibt ja bereits folgendes:

    # Fix missing authorization-header on fast_cgi installations
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]

    Wenn ich dies mit dem hier besprochenen ersetze, oder oberhalb/unterhalb hinzufüge, klappt es leider immer noch nicht.

    Du musst die Zeile im Block "Module mod_rewrite.c" einsetzen.

    Fehlt denn die Zeile bei dir? Welche Version nutzt du?

     

Sign In or Register to comment.