Wie verwende ich die OAuth-Authentifizierung mit der REST-API über CURL-Befehle?

18

Ich versuche, die WordPress Rest-API mit Authentifizierung zu verwenden, um mehr Daten von der API zu erhalten. Ich habe das Oauth-Plugin, das rest-api-Plugin und API-Anmeldeinformationen von WP-CLI installiert.

Ich habe herausgefunden, wie ich ohne Autorisierung auf Daten zugreifen kann. Das funktioniert:

// set our end point
$domain = "http://localhost/wp-api";
$endpoint = $domain."/wp-json/wp/v2/posts/";


$curl = curl_init($endpoint);

curl_setopt_array($curl, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_URL            => $endpoint,
]);
$response = curl_exec($curl);
$decoderesponse = json_decode($response, true);

?>

<pre>
  <?php print_r($decoderesponse); ?>
</pre>

Ich kann jedoch nicht herausfinden, wie ich mich mit Anmeldeinformationen authentifizieren kann. Hier ist mein Versuch. Ich bin nicht sicher, ob "Schlüssel" und "Geheimnis" richtig sind.

// Oauth credentials from wp-cli
$ID = "4";
$Key = "l8XZD9lX89kb";
$Secret = "UUbcc8vjUkGjuDyvK1gRTts9sZp2N8k9tbIQaGjZ6SNOyR4d";

// set our end point
$domain = "http://localhost/wp-api";
$endpoint = $domain."/wp-json/wp/v2/posts/1/revisions";

$headers[] = "key=$Key";
$headers[] = "secret=$Secret";

$curl = curl_init($endpoint);

curl_setopt_array($curl, [
  CURLOPT_HTTPHEADER     => $headers,
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_URL            => $endpoint,
]);
$response = curl_exec($curl);
$decoderesponse = json_decode($response, true);

?>

<pre>
  <?php print_r($decoderesponse); ?>
</pre>

Die Ausgabe ist

Array
(
    [code] => rest_cannot_read
    [message] => Sorry, you cannot view revisions of this post.
    [data] => Array
        (
            [status] => 401
        )
)

Wie kann ich das zum Laufen bringen? Vielen Dank.

JediTricks007
quelle
2
Die Dinge sind nicht so einfach. Ich habe versucht, eine Antwort zu schreiben, aber es ist ziemlich lang. Beginnen Sie mit dem Lesen der Dokumentation, insbesondere des Authorization Flow . Dieser Beitrag hat auch ein tolles Tutorial .
Cybmeta

Antworten:

10

Gehen wir hier Schritt für Schritt vor. Anscheinend versuchen Sie, OAuth nur für die Authentifizierung zu verwenden, aber bevor Sie dies tun können, müssen Sie das Zugriffstoken abrufen , das zur Authentifizierung bei Ihren API-Aufrufen verwendet wird.

Da dies OAuth Version 1 verwendet, müssen Sie die folgenden Schritte ausführen, um das Zugriffstoken zu erhalten :

  1. Richten Sie zunächst eine Anwendung ein und rufen Sie die Site an, um das Anforderungstoken (temporäre Anmeldeinformationen) mit der Client-ID und dem geheimen Kennwort für die Anwendung abzurufen
  2. Rufen Sie anschließend die Site an, um die Anwendung mit dem Anforderungstoken aus dem ersten Schritt zu autorisieren (mit Blick auf den Benutzer, siehe unten).
  3. Drittens rufen Sie nach Abschluss der Autorisierung die Site an, um das Zugriffstoken zu erhalten (jetzt, da die Anwendung autorisiert wurde).

Ich empfehle die Verwendung von Postman für die ersten Schritte, da diese nur einmal ausgeführt werden müssen. Postman wird auch den Griff zu erzeugen timestamp, nonceund oauth signature, also , wenn Sie nicht eine OAuth - Bibliothek verwenden, dann sollten Sie unbedingt Postman verwenden. Sobald Sie Ihr Access Token haben , können Sie die Anrufe über CURL ohne Bibliotheken tätigen.

https://www.getpostman.com/

Erster Schritt (Setup-Anwendung)

Installiere das WP OAuth 1 Plugin, aktiviere es und gehe dann zum Menüpunkt unter Users> Applications . Neue Anwendung hinzufügen, Name und Beschreibung ausfüllen. Für einen Rückruf entweder die URL, zu der der Benutzer umgeleitet werden soll (nach der Autorisierung), oder oopfür einen Out-of-Band-Fluss, der zu einer internen Seite umgeleitet wird, auf der das Prüfer-Token angezeigt wird (anstatt umzuleiten).

https://github.com/WP-API/OAuth1/blob/master/docs/basics/Registering.md

Um mit dem zweiten Schritt fortzufahren, muss ein Anruf an Ihre Site mit der Client-ID und dem Client-Geheimnis der erstellten Anwendung getätigt werden , um temporäre Anmeldeinformationen (Request Token) abzurufen.

Öffnen Sie Postman, erstellen Sie einen neuen Anruf http://website.com/oauth1/request, klicken Sie auf die Registerkarte Autorisierung, wählen Sie OAuth 1.0 aus der Dropdown-Liste aus, geben Sie den Client-Schlüssel und das Client-Geheimnis ein, setzen Sie die Signaturmethode auf HMAC-SHA1, aktivieren Sie das Hinzufügen von Parametern zum Header, codieren Sie die Signatur und klicken Sie dann auf Aktualisierungsanforderung

Postman OAuth1 Anfrage

Postman generiert automatisch die Signatur, den Nonce und den Zeitstempel für Sie und fügt sie der Kopfzeile hinzu (Sie können sie auf der Registerkarte "Kopfzeilen" anzeigen).

Klicken Sie auf Senden , und Sie sollten eine Antwort erhalten, der folgendes beinhaltet oauth_tokenund oauth_token_secret: Antwort auf die OAuth1-Anforderung des Postboten

Diese Werte werden im nächsten Schritt verwendet, um die Anwendung unter Ihrem WordPress-Benutzerkonto zu autorisieren.

Zweiter Schritt (Antrag genehmigen)

Der Autorisierungsschritt muss nur einmal ausgeführt werden. Dieser Schritt ist benutzerbezogen und jedem vertraut. Dieser Schritt ist erforderlich, da Sie OAuth1 verwenden und die Anwendung mit einem WordPress-Benutzerkonto verknüpft sein muss. Überlegen Sie, wann eine Website es Ihnen ermöglicht, sich mit Facebook anzumelden. Sie werden zu Facebook weitergeleitet, wo Sie sich anmelden und auf "Autorisieren" klicken. Dies muss nur über Ihre WordPress-Website erfolgen.

Ich empfehle, für diesen Schritt Ihren Webbrowser zu verwenden, da Sie einfach die Variablen in der URL festlegen können. Auf dieser Seite wird die Seite "Autorisieren" zum Autorisieren der Anwendung angezeigt.

Öffnen Sie Ihren Webbrowser und geben Sie die URL zu Ihrer Site wie folgt ein: http://website.com/oauth1/authorize

Ergänzen Sie nun diese URL oauth_consumer_key(Client-ID) oauth_tokenund oauth_token_secret(aus dem vorherigen Schritt). In meinem Beispiel ist dies die vollständige URL:

http://website.com/oauth1/authorize?oauth_consumer_key=TUPFNj1ZTd8u&oauth_token=J98cN81p01aqSdFd9rjkHZWI&oauth_token_secret=RkrMhw8YzXQljyh99BrNHmP7phryUvZgVObpmJtos3QExG1O

OAuth1-Autorisierungsanwendung

Sobald Sie auf Autorisieren klicken, wird ein weiterer Bildschirm mit dem Bestätigungstoken angezeigt. In meinem Beispiel ist dies das zurückgegebene VerifikationstokenE0JnxjjYxc32fMr2AF0uWsZm

Dritter Schritt (Zugriffstoken abrufen)

Nachdem wir die Anwendung autorisiert haben, müssen wir einen letzten Aufruf durchführen, um das Autorisierungstoken abzurufen, das für alle API-Aufrufe verwendet wird. Genau wie im ersten Schritt verwende ich Postman (da die Signatur HMAC-SHA1 sein muss), und dies erleichtert die Durchführung dieser Schritte um das 100-fache.

Öffnen Sie Postman erneut und ändern Sie die URL in http://website.com/oauth1/access

Stellen Sie sicher, dass Sie das Token und das Token Secret (Werte aus dem ersten Schritt) hinzufügen, und klicken Sie dann auf Params , um die Felder unter der URL anzuzeigen . Geben Sie links oauth_verifier ein und rechts den Code aus dem zweiten Schritt, dem Verification Token

Zugangsschritt Postman OAuth1

Stellen Sie sicher, dass Sie auf Update Request und dann auf Send klicken, und Sie sollten eine Antwort mit oauth_tokenund oauth_token_secret... erhalten. Dies ist, was Sie benötigen, um Ihre API-Aufrufe zu tätigen! Verwerfen Sie die Originale aus Schritt 1, speichern Sie diese in Ihrem Code oder an einem anderen sicheren Ort.

Antwort von Postman OAuth1 Access

Anschließend können Sie einen API-Aufruf an Ihre Site senden und die Header mit dem zurückgegebenen Token und dem Token-Geheimnis festlegen.

Sie können dies auf mehrere Arten über den Autorisierungsheader, in GET-Parametern oder POST (wenn als application / x-www-form-urlencoded codiert) übergeben. Denken Sie daran, dass Sie die Unterschrift, den Zeitstempel und den Nonce weitergeben MÜSSEN. Ich wusste nicht, wie lange diese Antwort dauern würde, also werde ich dies morgen mit einem Beispiel aktualisieren, um dies mit Ihrem Code zu tun.

Ich empfehle dringend, das Rest-API-Protokoll zu installieren, damit Sie das Protokoll der API-Aufrufe anzeigen und sehen können, was gesendet, zurückgegeben usw. wurde. Dies hilft beim Debuggen enorm.

https://github.com/petenelson/wp-rest-api-log

sMyles
quelle
Ich weiß, es gibt viele Tutorials mit Postman oder ähnlichen Tools, aber ich kann keine Tutorials finden, die den gesamten Prozess mit CURL-Funktionalitäten ausführen, ich meine reinen PHP-Code. Das ist, was ich will.
MinhTri
@ Dan9 TBH das ist nicht wirklich möglich ... zumindest nicht mit OAuth1, hauptsächlich weil du die Anwendung unter einem Benutzerkonto AUTORISIEREN musst. Alle anderen Schritte sind einfach mit CURL zu erledigen. Das Problem besteht darin, sich mit CURL als WordPress-Benutzer anzumelden (was bedeutet, dass Sie Anmeldeinformationen in Ihrer PHP-Datei speichern müssen, was keine gute Idee ist) UND die Anwendung, die Sie verwenden, zu autorisieren könnte die OAuth1-Codebasis ändern, aber ehrlich gesagt, wenn Sie CURL verwenden möchten, um ALLES zu tun ... denken Sie darüber falsch und sollten sich eine andere Lösung oder Methode einfallen lassen.
sMyles
@ Dan9 Mit dem, was Sie versuchen, sollten Sie OAuth2-Server anstelle von OAuth1 verwenden, vor allem, weil OAuth2 über neue Funktionen verfügt, einschließlich des Grant-Typs für Client-Anmeldeinformationen, mit dem alle diese Schritte vermieden
sMyles
@ Dan9 Wenn Sie zu 100% darauf aus sind, mithilfe von CURL über OAuth1 Hilfe zu erhalten, kann dies mit ein paar Code-Hacks möglich sein. Wie bereits erwähnt, müssen Sie jedoch USERNAME und PASSWORD eines Benutzers speichern in die PHP-Datei. Wenn Sie sich gut mit, lassen Sie mich weiß , und krank ein Tutorial schreiben, um es zu tun ROTATION verwenden, will nicht die Zeit mit dem Schreiben Tutorial verbringen , wenn Sie mit OAuth2 gehen gehen oder nicht , dies mehr brauchen
sMyles
@ Dan9 gut ... das ist es nur ... wenn du OAuth1 verwenden willst, musst du ein WordPress-Benutzerkonto zuordnen. Stellen Sie sich das Access Token im Grunde wie einen API-Schlüssel vor. Der "API-Schlüssel" muss einem Benutzerkonto zugeordnet werden. Jetzt liegt es an Ihnen, ob Sie ein von Ihnen eingerichtetes Standardkonto verwenden. Unabhängig davon, ob Sie OAuth1 verwenden MUSS mit einem Benutzerkonto verknüpft sein, daher der langwierige Prozess, um das Zugriffstoken zu erhalten.
sMyles
2

Fügen Sie dies als weitere Antwort hinzu, um herauszufinden, wie Sie dies tun können. Grundsätzlich MÜSSEN Sie, wie in meinen Kommentaren erwähnt, OAuth1 mit einem Benutzerkonto verknüpfen, um dies zu erreichen.

Zuerst müssen Sie CURL verwenden, um sich auf der Site mit einem Benutzernamen-Passwort für WordPress anzumelden. Speichern Sie das Cookie, damit Sie es in Ihrem CURL-Aufruf an OAuth verwenden können.

/programming/724107/wordpress-autologin-using-curl-or-fsockopen-in-php

Rufen Sie dann OAuth mit CURL mit der Client-ID und dem Client-Geheimnis an, um das temporäre Oauth-Token und -Geheimnis (Request Token) abzurufen.

Um diesen Anruf (und den Anruf zum Abrufen des Zugriffstokens) zu tätigen, müssen Sie Ihren CURL-Anruf korrekt einrichten. Code und Verweise finden Sie am Ende dieser Antwort.

Nachdem Sie das temporäre Oauth-Token und -geheimnis (Request Token) erhalten haben, rufen Sie mit CURL POST diese URL Ihrer Site auf:

http://website.com/oauth1/authorize

Anschließend müssen Sie alle Werte aus dem zurückgegebenen HTML-Code für die Autorisierungsseite abrufen und anschließend Ihren eigenen POST an die Formularaktions-URL senden.

/programming/35363815/how-to-get-a-value-input-from-html-returned-of-curl

Insbesondere müssen diese in Ihren POST-Daten enthalten sein, um die "Autorisierungs" -POST zu vervollständigen http://domain.com/wp-login.php?action=oauth1_authorize

  • _wpnonce - Dies ist der Nonce-Wert für das zu sendende Formular. Dieser muss aus der HTML-Eingabe entnommen und mit Ihrem POST gesendet werden

    consumer - Dies ist eine versteckte Eingabe im HTML (dies ist ein Verweis auf eine Beitrags-ID, daher müssen Sie sie aus der HTML-Eingabe ziehen

    oauth_token - Dies ist eine versteckte Eingabe im HTML (sollte aber auch schon vorhanden sein)

    wp-submit - Dies muss auf den Wert gesetzt werden authorize

Hier ist ein Beispiel-HTML für die Authentifizierungsseite:

<form name="oauth1_authorize_form" id="oauth1_authorize_form" action="http://website.com/wp-login.php?action=oauth1_authorize" method="post">

    <h2 class="login-title">Connect My Auth</h2>

    <div class="login-info">
        <p>Howdy <strong>admin</strong>,<br/> "My OAuth Demo" would like to connect to Example Site.</p>

    </div>

    <input type="hidden" name="consumer" value="5428" /><input type="hidden" name="oauth_token" value="i1scugFXyPENniCP4kABKtGb" /><input type="hidden" id="_wpnonce" name="_wpnonce" value="ca9b267b4f" /><input type="hidden" name="_wp_http_referer" value="/wp-login.php?action=oauth1_authorize&amp;oauth_consumer_key=TUPFNj1ZTd8u&amp;oauth_token=i1scugFXyPENniCP4kABKtGb&amp;oauth_token_secret=gzqW47pHG0tilFm9WT7lUgLoqN2YqS6tFFjUEiQoMgcmG2ic" />   <p class="submit">
        <button type="submit" name="wp-submit" value="authorize" class="button button-primary button-large">Authorize</button>
        <button type="submit" name="wp-submit" value="cancel" class="button button-large">Cancel</button>
    </p>

</form>

Nachdem Sie den POST mit all diesen Werten / Daten durchgeführt haben, ist dies der HTML-Code, der mit dem Autorisierungscode zurückgegeben wird (daher müssen Sie den Wert aus dem <code>Block ziehen:

<div id="login">
    <h1><a href="https://wordpress.org/" title="Powered by WordPress" tabindex="-1">Example Site</a></h1>
    <p>Your verification token is <code>yGOYFpyawe8iZmmcizqVIw3f</code></p> <p id="backtoblog"><a href="http://website.com/">&larr; Back to Example Site</a></p>
</div>

Sobald Sie über das Verifizierungstoken verfügen, können Sie die /oauth1/accessVerwendung des Verifizierungstokens, des Oauth-Tokens und des Oauth-Token-Geheimnisses anrufen. Das Verifikationstoken muss in die POST-Daten als eingetragen werdenoauth_verifier

Damit erhalten Sie Ihr neues und permanentes Access Token und VOILA!

Beispiel CURL-Code

Im Folgenden finden Sie einen Beispielcode für den CURL-Aufruf. Der wichtigste Teil besteht darin, wie der CURL oauth_signaturegeneriert wird:

https://oauth1.wp-api.org/docs/basics/Signing.html

function buildBaseString($baseURI, $method, $params){
    $r = array();
    ksort($params);
    foreach($params as $key=>$value){
        $r[] = "$key=" . rawurlencode($value);
    }

    return $method."&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $r));
}

function buildAuthorizationHeader($oauth){
    $r = 'Authorization: OAuth ';
    $values = array();
    foreach($oauth as $key=>$value)
        $values[] = "$key=\"" . rawurlencode($value) . "\"";

    $r .= implode(', ', $values);
    return $r;
}

// Add request, authorize, etc to end of URL based on what call you're making
$url = "http://domain.com/oauth/";

$consumer_key = "CLIENT ID HERE";
$consumer_secret = "CLIENT SECRET HERE";

$oauth = array( 'oauth_consumer_key' => $consumer_key,
                'oauth_nonce' => time(),
                'oauth_signature_method' => 'HMAC-SHA1',
                'oauth_callback' => 'oob',
                'oauth_timestamp' => time(),
                'oauth_version' => '1.0');

$base_info = buildBaseString($url, 'GET', $oauth);
$composite_key = rawurlencode($consumer_secret) . '&' . rawurlencode($oauth_access_token_secret);
$oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
$oauth['oauth_signature'] = $oauth_signature;


$header = array(buildAuthorizationHeader($oauth), 'Expect:');
$options = array( CURLOPT_HTTPHEADER => $header,
                  CURLOPT_HEADER => false,
                  CURLOPT_URL => $url,
                  CURLOPT_RETURNTRANSFER => true,
                  CURLOPT_SSL_VERIFYPEER => false);

$feed = curl_init();
curl_setopt_array($feed, $options);
$json = curl_exec($feed);
curl_close($feed);

$return_data = json_decode($json);

print_r($return_data);

Auf dieser Site erfahren Sie genau, wie Sie die OAuth-Signatur codieren und mit CURL senden (ich empfehle, die gesamte Seite zu lesen): https://hannah.wf/twitter-oauth-simple-curl-requests-for-your-own- Daten/

Weitere Ressourcen zum Generieren der OAuth1-Signatur: /programming/24613277/oauth-signature-generation-using-hmac-sha1

Weitere Ressourcen: http://collaboradev.com/2011/04/01/twitter-oauth-php-tutorial/

sMyles
quelle
Wie kann ich die Client-ID und das Client-Geheimnis abrufen und einem gültigen Benutzer zuordnen? Derzeit können nur Administratoren eine neue App erstellen. Dies geschieht ausschließlich über das Admin-Dashboard. Übrigens habe ich versucht, oauth_signaturewie Sie gesagt haben, zu generieren , aber irgendwie ist die Antwort immer json_oauth1_signature_mismatch.
MinhTri
@ Dan9 Ja, das ist richtig. Administratoren müssen die App erstellen. Andernfalls wäre dies ein großes Sicherheitsproblem, da Apps von anonymen Benutzern erstellt werden können. Hier sind einige Websites bezüglich der Signatur wordpress.stackexchange.com/questions/185511/… github.com/WP-API/OAuth1/issues/34 github.com/WP-API/OAuth1/issues/27
sMyles
0

Update: Nach dem, was ich gelesen habe, müssen Sie mehrere Locken machen, um das access_token zu erhalten, das Sie dann für die Abfrage verwenden

  • Erfassung temporärer Anmeldeinformationen: Der Client erhält eine Reihe temporärer Anmeldeinformationen vom Server.
  • Autorisierung: Der Benutzer "autorisiert" das Anforderungstoken für den Zugriff auf sein Konto.
  • Token-Austausch: Der Client tauscht die kurzlebigen temporären Anmeldeinformationen gegen ein langlebiges Token aus.

oauth1 Server Flow

juz
quelle
0

Ich weiß, dass ich etwas spät dran bin, aber können Sie wp_remote_get und _post verwenden?

Ich rufe Inhalte mit meiner WordPress-Installation ab und poste sie mit ihnen:

Dies ist die allgemeine Idee aus dem WordPress-Codex:

$response = wp_remote_post( $url, array(
    'body'    => $data,
    'httpversion' => '1.0',
    'sslverify' => false,
    'headers' => array(
        'Authorization' => 'Basic ' . base64_encode( $username . ':' . $password ),
    ),
) );

Hier ist ein genaueres Beispiel:

$url='http://WWW.EXAMPLE HERE.';
$response = wp_remote_post( $url, array(
    'method' => 'POST',
    'timeout' => 45,
    'redirection' => 5,
    'httpversion' => '1.0', //needed to get a response
    'blocking' => true,
    'headers' => array('Authorization' => 'Basic ' . base64_encode( 'MY TOKENID' . ':' . '' )),
    'body' => $body // in array
    'cookies' => array()
    )
);

if ( is_wp_error( $response ) ) {
   $error_message = $response->get_error_message();
   echo "Something went wrong: $error_message";
} else {
 //  echo 'Response:<pre>';
 //  print_r( $response );
 //    echo '</pre>'; 
$responseBody = json_decode($response['body'],true);
echo $responseBody['message'];

    }
    }
}

Der Trick besteht darin, den Benutzernamen und pw zu codieren. Häufig bleibt die Zeit abhängig vom API-Benutzernamen und pw entweder leer oder es handelt sich um Ihre Token.

so waren zum Beispiel in meinem Beispiel oben die Überschriften

'headers' => array('Authorization' => 'Basic ' . base64_encode( 'MYTOKENID' . ':' . '' ))

und ich ließ pw leer. Dies hängt jedoch vom verwendeten API-System ab.

rudtek
quelle