Jak korzystać z uwierzytelniania OAuth z REST API za pomocą poleceń CURL?


18

Próbuję użyć WordPress Rest Api z uwierzytelnianiem, aby uzyskać więcej danych z interfejsu API. Zainstalowałem wtyczkę Oauth, wtyczkę rest-api i otrzymałem dane uwierzytelniające API z WP-CLI.

Wymyśliłem, jak uzyskać dostęp do danych bez autoryzacji. To działa:

// 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>

Ale nie mogę wymyślić, jak uwierzytelnić się przy użyciu poświadczeń. Oto moja próba. Nie jestem pewien, czy „klucz” i „sekret” są poprawne.

// 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>

Dane wyjściowe to

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

Jak mogę to uruchomić? Dziękuję Ci.


2
Nie jest tak łatwo. Próbowałem napisać odpowiedź, ale jest ona dość długa. Możesz zacząć od przeczytania dokumentów, zwłaszcza Przepływ autoryzacji . Ten post ma również świetny samouczek .
cybmeta

Odpowiedzi:


10

Chodźmy tutaj krok po kroku. Wygląda na to, że próbujesz użyć OAuth tylko do uwierzytelnienia, ale zanim będziesz mógł to zrobić, musisz uzyskać token dostępu, który będzie używany do uwierzytelnienia podczas wykonywania wywołań interfejsu API.

Ponieważ używa to OAuth w wersji 1, aby uzyskać token dostępu , wykonaj następujące czynności:

  1. Najpierw skonfiguruj aplikację, zadzwoń do witryny, aby uzyskać token żądania (poświadczenia tymczasowe) przy użyciu identyfikatora klienta i klucza tajnego aplikacji
  2. Po drugie, zadzwoń do witryny w celu autoryzacji aplikacji za pomocą tokena żądania od pierwszego kroku (w kierunku użytkownika, patrz poniżej).
  3. Po trzecie, po zakończeniu autoryzacji wywołujesz witrynę, aby uzyskać token dostępu (teraz, gdy aplikacja została autoryzowana)

Polecam korzystanie z Listonosza w pierwszych kilku krokach, ponieważ trzeba je wykonać tylko raz. Postman zajmie się także generowaniem timestamp, noncea oauth signaturewięc jeśli nie korzystasz z biblioteki OAuth, powinieneś bezwzględnie użyć Postmana. Po uzyskaniu tokena dostępu możesz wykonywać połączenia przez CURL bez żadnych bibliotek.

https://www.getpostman.com/

Pierwszy krok (aplikacja instalacyjna)

Zainstaluj wtyczkę WP OAuth 1, aktywuj, a następnie przejdź do pozycji menu w obszarze Użytkownicy> Aplikacje . Dodaj nową aplikację, wpisz nazwę i opis. W przypadku wywołania zwrotnego adres URL przekierowujący użytkownika (po autoryzacji) lub oopprzepływ pozapasmowy, który przekieruje na wewnętrzną stronę wyświetlającą token weryfikacyjny (zamiast przekierowywania).

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

Aby przejść do drugiego kroku, należy wykonać połączenie z witryną, używając identyfikatora klienta i tajnego klucza klienta z utworzonej aplikacji, aby uzyskać tymczasowe poświadczenia (token żądania).

Otwórz Listonosza, utwórz nowe połączenie http://website.com/oauth1/request, kliknij kartę Autoryzacja, wybierz z menu rozwijanego OAuth 1.0, wprowadź klucz klienta, klucz tajny klienta, ustaw metodę podpisu na HMAC-SHA1, włącz dodawanie parametrów do nagłówka, koduj podpis , a następnie kliknij Żądanie aktualizacji

Żądanie listonosza OAuth1

Listonosz automatycznie wygeneruje dla Ciebie podpis, kod jednorazowy i znacznik czasu i doda je do nagłówka (możesz wyświetlić w zakładce Nagłówki).

Kliknij Wyślij, a otrzymasz odpowiedź zawierającą oauth_tokeni oauth_token_secret: Listonosz OAuth1 Prośba o odpowiedź

Wartości te zostaną wykorzystane w następnym kroku do autoryzacji aplikacji na koncie użytkownika WordPress.

Drugi krok (autoryzacja aplikacji)

Krok autoryzacji należy wykonać tylko raz, ten krok jest skierowany do użytkownika i jest znany wszystkim. Ten krok jest wymagany, ponieważ używasz OAuth1, a aplikacja musi być powiązana z kontem użytkownika WordPress. Pomyśl o tym, kiedy strona pozwala zalogować się za pomocą Facebooka ... przekierowują cię do Facebooka, gdzie się logujesz i kliknij „Autoryzuj” ... to trzeba zrobić, tylko za pośrednictwem witryny WordPress.

Zalecam użycie przeglądarki internetowej do tego kroku, ponieważ możesz łatwo ustawić zmienne w adresie URL, a to zapewnia stronę „Autoryzuj” do autoryzacji aplikacji.

Otwórz przeglądarkę internetową i wpisz adres URL swojej witryny: http://website.com/oauth1/authorize

Teraz dodaj do tego adresu URL oauth_consumer_key(identyfikator klienta) oauth_tokeni oauth_token_secret(z poprzedniego kroku). W moim przykładzie jest to pełny adres URL:

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

OAuth1 Autoryzuj aplikację

Po kliknięciu Autoryzuj pojawi się kolejny ekran z tokenem weryfikacyjnym. W moim przykładzie jest to zwrócony token weryfikacyjnyE0JnxjjYxc32fMr2AF0uWsZm

Trzeci krok (zdobądź token dostępu)

Po autoryzacji aplikacji musimy wykonać ostatnie połączenie, aby uzyskać token autoryzacji, który będzie używany do wykonywania wszystkich wywołań interfejsu API. Podobnie jak w pierwszym kroku zamierzam użyć Postmana (ponieważ wymagany jest podpis HMAC-SHA1) i dzięki temu 100 razy łatwiej jest wykonać te kroki.

Ponownie otwórz Listonosza i zmień adres URL na http://website.com/oauth1/access

Pamiętaj, aby dodać Token i Token Secret (wartości z pierwszego kroku), a następnie kliknij Params, aby wyświetlić pola pod adresem URL. Po lewej wpisz oauth_verifier, a po prawej wprowadź kod z drugiego kroku, token weryfikacyjny

Krok dostępu do listonosza OAuth1

Upewnij się, że kliknąłeś Żądanie aktualizacji, a następnie kliknij Wyślij, a powinieneś otrzymać odpowiedź z powrotem oauth_tokeni oauth_token_secret... to jest to, czego potrzebujesz, aby wykonywać połączenia API! Odrzuć oryginalne z kroku 1, zapisz te w swoim kodzie lub w innym bezpiecznym miejscu.

Odpowiedź dostępu Listonosza OAuth1

Następnie możesz wykonać wywołanie interfejsu API do swojej witryny, ustawiając nagłówki za pomocą zwróconego tokena i tajnego tokena.

Możesz przekazać to na wiele sposobów, poprzez nagłówek autoryzacji, w parametrach GET lub POST (jeśli jest zakodowany jako application / x-www-form-urlencoded). Pamiętaj, że MUSISZ przekazać podpis, znacznik czasu i nonce. Nie zdawałem sobie sprawy, jak długo zajmie mi ta odpowiedź, więc zaktualizuję to jutro, podając przykład zrobienia tego z twoim kodem.

Zdecydowanie zalecamy zainstalowanie dziennika Rest API, abyś mógł przeglądać dziennik wywołań API oraz zobaczyć, co zostało wysłane, zwrócone itp. Pomoże to w ogromnym debugowaniu.

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


Wiem, że istnieje wiele samouczków z Postmanem lub podobnymi narzędziami, ale nie mogę znaleźć żadnych samouczków, które mogłyby wykonać cały proces z funkcjami CURL, mam na myśli czysty kod PHP. To jest to czego chce.
MinhTri

@ Dan9 TBH nie jest to naprawdę możliwe ... przynajmniej nie z OAuth1, głównie dlatego, że musisz AUTORYZOWAĆ aplikację na koncie użytkownika. Wszystkie pozostałe kroki są łatwe do wykonania w CURL, problemem jest użycie CURL do zalogowania się jako użytkownik WordPress (co oznacza, że ​​musisz przechowywać poświadczenia w pliku PHP, co NIE jest dobrym pomysłem) ORAZ autoryzacji aplikacji, którą ty może zmodyfikować bazę kodową OAuth1, ale szczerze mówiąc, jeśli chcesz używać CURL do WSZYSTKIEGO ... myślisz o tym w niewłaściwy sposób i powinieneś znaleźć inne rozwiązanie lub metodę.
sMyles

@ Dan9 z tym, co próbujesz zrobić, powinieneś użyć serwera OAuth2 zamiast OAuth1, głównie dlatego, że fakt, że OAuth2 ma nowe funkcje, w tym rodzaj przyznania Poświadczenia klienta, co pozwala uniknąć konieczności wykonywania wszystkich tych czynności bshaffer.github.io / oauth2-server-php-docs / grant-types /…
sMyles 20.09.16

@ Dan9, jeśli jesteś w 100% nastawiony na uzyskanie pomocy przy użyciu OAuth1, używając CURL, myślę, że jest to możliwe przy kilku włamaniach do kodu, ale jak wspomniałem, oznacza to, że musisz zapisać NAZWĘ UŻYTKOWNIKA i HASŁO użytkownika do pliku PHP. Jeśli nie masz nic przeciwko, daj mi znać i źle napisaj samouczek, aby to zrobić za pomocą CURL, nie chcę tracić czasu na pisanie samouczka, jeśli zamierzasz korzystać z OAuth2 lub nie potrzebujesz już tego
sMyles,

@ Dan9 cóż ... to wszystko ... jeśli zamierzasz używać OAuth1, musisz powiązać konto użytkownika WordPress. Zasadniczo myśl o tokenie dostępu jak o kluczu API ... „klucz API” musi być powiązany z kontem użytkownika… teraz, czy używasz jakiegoś standardowego konta, które konfigurujesz, zależy od ciebie… ale niezależnie od tego, kiedy używasz OAuth1 to MUSI być powiązany z kontem użytkownika, dlatego długi proces uzyskiwania tokena dostępu.
sMyles,

2

Dodając to jako kolejną odpowiedź, która pomoże ci dowiedzieć się, jak to zrobić. Zasadniczo, jak wspomniano w moich komentarzach, jeśli zamierzasz używać OAuth1, MUSISZ powiązać go z kontem użytkownika, nie ma mowy o tym.

Najpierw musisz użyć CURL, aby zalogować się do witryny za pomocą hasła nazwy użytkownika do WordPress, zapisz plik cookie, abyś mógł go użyć w swoim wywołaniu CURL do OAuth (pamiętaj o zaktualizowaniu połączenia CURL, aby zawierało plik cookie):

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

Następnie zadzwoń do OAuth za pomocą CURL z identyfikatorem klienta i kluczem tajnym klienta, aby uzyskać tymczasowy token oauth i klucz tajny (token żądania)

Aby wykonać to połączenie (i połączenie w celu uzyskania tokena dostępu), musisz poprawnie skonfigurować połączenie CURL. Kod i odniesienia znajdują się na końcu tej odpowiedzi.

Po uzyskaniu tymczasowego tokena oauth i tajnego klucza (token żądania) wykonaj wywołanie CURL POST na ten adres URL swojej witryny:

http://website.com/oauth1/authorize

Następnie należy pobrać wszystkie wartości ze zwróconego kodu HTML strony autoryzacji, a następnie przesłać własny test POST na adres URL akcji formularza.

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

W szczególności należy je uwzględnić w danych POST, aby wykonać POST „autoryzacja” http://domain.com/wp-login.php?action=oauth1_authorize

  • _wpnonce - Jest to wartość jednorazowa dla formularza, który należy przesłać, MUSI zostać pobrany z danych wejściowych HTML i przesłany za pomocą POST

    consumer - To jest ukryty wpis w HTML (jest to odniesienie do identyfikatora postu, więc musisz pobrać go z wejścia HTML

    oauth_token - To jest ukryte wejście w HTML (ale powinieneś już to mieć)

    wp-submit - To musi być ustawione na wartość authorize

Oto przykład HTML wygenerowany dla strony uwierzytelniania:

<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>

Po wykonaniu testu POST z tymi wszystkimi wartościami / danymi, jest to HTML, który zostanie zwrócony z kodem autoryzacyjnym (więc musisz pobrać wartość z wnętrza <code>bloku:

<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>

Po uzyskaniu tokena weryfikacyjnego możesz nawiązać połączenie z /oauth1/accessużyciem tokena weryfikacyjnego, oauth token i oauth token secret. Token weryfikacyjny należy umieścić w danych POST jakooauth_verifier

To zwróci twój nowy i stały token dostępu oraz VOILA!

Przykładowy kod CURL

Poniżej znajduje się przykładowy kod do wykonania wywołania CURL, przy czym najważniejszą częścią jest sposób oauth_signaturegenerowania:

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);

Ta strona dokładnie mówi, jak zakodować podpis OAuth i jak wysyłać za pomocą CURL (polecam przeczytać całą stronę): https://hannah.wf/twitter-oauth-simple-curl-requests-for-your-own- dane/

Więcej zasobów na temat generowania podpisu OAuth1: /programming/24613277/oauth-signature-generation-using-hmac-sha1

Inne zasoby: http://collaboradev.com/2011/04/01/twitter-oauth-php-tutorial/


Jak mogę uzyskać identyfikator klienta i klucz tajny klienta i powiązać go z ważnym użytkownikiem? Obecnie tylko administratorzy mogą utworzyć nową aplikację i dzieje się to tylko za pośrednictwem pulpitu administratora. Przy okazji, próbowałem wygenerować, oauth_signaturejak powiedziałeś, ale jakoś odpowiedź jest zawsze json_oauth1_signature_mismatch.
MinhTri

@ Dan9 tak, to prawda, administratorzy muszą utworzyć aplikację, w przeciwnym razie byłby to ogromny problem z bezpieczeństwem, umożliwiający tworzenie aplikacji przez anonimowych użytkowników. Oto kilka stron dotyczących podpisu wordpress.stackexchange.com/questions/185511/… github.com/WP-API/OAuth1/issues/34 github.com/WP-API/OAuth1/issues/27
sMyles

0

Aktualizacja: Z tego, co przeczytałem, musisz zrobić wiele loków, aby uzyskać access_token, którego następnie używasz do wykonania zapytania

  • Pozyskiwanie tymczasowych poświadczeń: Klient otrzymuje zestaw tymczasowych poświadczeń z serwera.
  • Autoryzacja: Użytkownik „autoryzuje” token żądania, aby uzyskać dostęp do swojego konta.
  • Wymiana tokenów: Klient wymienia tymczasowe poświadczenia krótkotrwałe na token długowieczny.

Przepływ serwera oauth1


0

Wiem, że się trochę spóźniam, ale czy możesz użyć wp_remote_get i _post?

Korzystam z nich za pomocą mojej instalacji WordPressa:

Oto ogólna idea z kodeksu wordpress:

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

Oto bardziej konkretny przykład:

$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'];

    }
    }
}

Sztuką jest kodowanie nazwy użytkownika i pw. Teraz często czas w zależności od nazwy użytkownika API i pw będzie albo pusty, albo będzie twoimi tokenami.

na przykład w moim konkretnym przykładzie powyżej nagłówki były

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

i zostawiłem pw puste. To zależy od systemu API, którego używasz.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.