Wie fügen Sie einen Authorization-header einer HTTP-Anfrage mit file_get_contents()?

Wie der Titel sagt, ich habe Schwierigkeiten damit, eine signierte HTTP-Anforderung für OAuth 1.0 eine geschützte Datei.
Ich versuche, mit der file_get_contents-Methode für die Anforderung eines hinzufügen wollen, den Authorization-header mithilfe der stream_context_create () – Methode. [Sourcecode unten]

$url = "https://rest.immobilienscout24.de/restapi/api/offer/v1.0/user/me/realestate";
    $context = stream_context_create(array(
        'http' => array(
            'header'  => "Authorization: OAuth
            oauth_consumer_key = \"MY_KEY\”,
            oauth_token = \"MY_TOKEN\"
            oauth_signature_method= \"HMAC-SHA1\",
            oauth_timestamp=\"TIMESTAMP\",
            oauth_nonce=\"MY_NONCE\",
            oauth_signature=\"MY_SIGNATURE\""
        )
    ));
    $data = file_get_contents($url, false, $context);

Dies ist, wie die Anfrage Aussehen sollte

GET /api/file HTTP/1.1 Host: example.com
Authorization: OAuth oauth_consumer_key="KEY",
    oauth_token="TOKEN",
    oauth_signature_method="HMAC-SHA1",
    oauth_timestamp="TIMESTAMP",
    oauth_nonce="NONCE",
    oauth_signature="SIGNATURE"

Problem: ich bekomme immer die folgende Fehlermeldung:
failed to open stream: HTTP request failed! HTTP/1.1 401 Unauthorized in Zeile XX.
Was mache ich falsch? Ist es die Erstellung der header?
Ich weiß, das kann man mit curl auch, aber ich habe praktisch keine Kenntnisse und keine Erfahrung mit curl.

Danke für Eure Hilfe!

InformationsquelleAutor Philipp | 2016-08-28



One Reply
  1. 2

    Entsprechend der OAuth 1.0 a Spezifikation

    Das OAuth-Protokoll-Parameter gesendet werden, ist der in der Authorization-header der folgenden Art und Weise:

    1. Parameternamen und-Werte kodiert sind pro Parameter Encoding.

    2. Für jeden parameter, der name wird sofort gefolgt von einem ‚ = ‚- Zeichen (ASCII-code 61), a ‚“‚- Zeichen (ASCII-code 34), wird der parameter mit dem Wert (KANN leer sein), und ein anderer ‚“‚ – Zeichen (ASCII-code 34).

    3. Parameter werden getrennt durch ein Komma-Zeichen (ASCII-code 44) und OPTIONAL linear Leerzeichen pro [RFC2617].

    4. Den OPTIONALEN realm-parameter Hinzugefügt und interpretiert pro [RFC2617], Abschnitt 1.2.

    Einzige Problem ist, dass Sie einfügen \n (LF) – Zeichen in den header-string, was nicht erlaubt ist gemäß RFC2617. Sie scheinen auch zu fehlen ein Komma nach Sie oauth_token. Es ist auch unklar, ob Sie richtig sind der Kodierung der Parameter.

    Denke ich, dass ein einfacher Weg, um zu vermeiden, dass diese Fehler könnte entweder so etwas wie http_build_query und pass PHP_QUERY_RFC3986 als enc_type paremeter kompatibel mit RFC3986, was OAuth 1.0 a-Staaten folgt, oder Sie könnten einfach die Parameter einstellen, die in einem separaten array und array_map, um Sie zu Kodieren selbst.

    $params = [
        "realm"                  => $realm, /* optional */
        "oauth_consumer_key"     => $key,
        "oauth_token"            => $token,
        "oauth_signature_method" => $sigmeth,
        "oauth_timestamp"        => $timestamp,
        "oauth_nonce"            => $nonce,
        "oauth_signature"        => $sig,
    ];

    option 1

    /* This will give you the proper encoded string to include in your Authorization header */
    $params = http_build_query($params, null, ',', PHP_QUERY_RFC3986);    
    
    $opts = ["http" => ["header" => "Authorization: OAuth " . $params]];
    
    $context = stream_context_create($opts);
    $data = file_get_contents($url, false, $context);

    option 2

    $params = implode(',',array_map(function($v,$k) {
        return $k . '="' . rawurlencode($v) . '"';
    }, $params, array_keys($params)));
    
    $opts = ["http" => ["header" => "Authorization: OAuth " . $params]];
    
    $context = stream_context_create($opts);
    $data = file_get_contents($url, false, $context);

    Ich denke option 2 ist eigentlich mehr konform mit OAuth 1, weil http_build_query nicht zitieren, die Parameter. rawurlencode kompatibel mit RFC3986 das sollte helfen, halten Sie Ihre Werte richtig codiert.

    • Danke!!! Ich habe Ihnen in der Authorization-Header. Habe immer noch den gleichen Fehler. Gibt es eine Möglichkeit zu sehen, fordern Sie meinen xampp-server gesendet? Vielleicht könnte ich den Fehler zu finden dann…
    • Sorry, das ich eigentlich nie Lesen Sie die OAuth-1.0-Spezifikation vor. Ich glaube nicht, dass jemand immer noch mit OAuth1, aber nach einer kurzen überprüfung habe ich überarbeitet meine Antwort auf mehr treffend, Ihre Fragen. Es ist konkret zu OAuth1. Ich war gerade Antworten, als ob dies war eine Allgemeine HTTP-Frage.
    • Nochmals vielen Dank! Getestet habe ich beide Optionen. immer noch die gleiche Fehlermeldung. Würde ich die gleichen Fehler, wenn meine Keys & Signatur falsch wäre?
    • Ich würde vermuten, so. Nach den spec: „Wenn der Service-Provider lehnt eine Konsumenten-Anfrage, es SOLLTE reagieren mit HTTP 400 Bad Request oder HTTP 401 Unauthorized.„. Es listet Ungültige Signatur und Ungültige Consumer-Key, wie einige der Gründe, unter anderem, für eine 401-Antwort-code. Aber nicht Unterstützte Signatur-Methode ist als 400. Das könnte also eingrenzen, für die Sie nur ein bisschen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.