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.
authentication
rest-api
curl
JediTricks007
źródło
źródło
Odpowiedzi:
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:
Polecam korzystanie z Listonosza w pierwszych kilku krokach, ponieważ trzeba je wykonać tylko raz. Postman zajmie się także generowaniem
timestamp
,nonce
aoauth signature
wię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
oop
przepł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 naHMAC-SHA1
, włącz dodawanie parametrów do nagłówka, koduj podpis , a następnie kliknij Żądanie aktualizacjiListonosz 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_token
ioauth_token_secret
: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_token
ioauth_token_secret
(z poprzedniego kroku). W moim przykładzie jest to pełny adres URL:Po kliknięciu Autoryzuj pojawi się kolejny ekran z tokenem weryfikacyjnym. W moim przykładzie jest to zwrócony token weryfikacyjny
E0JnxjjYxc32fMr2AF0uWsZm
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
Upewnij się, że kliknąłeś Żądanie aktualizacji, a następnie kliknij Wyślij, a powinieneś otrzymać odpowiedź z powrotem
oauth_token
ioauth_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.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
źródło
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ą POSTconsumer
- To jest ukryty wpis w HTML (jest to odniesienie do identyfikatora postu, więc musisz pobrać go z wejścia HTMLoauth_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:
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:Po uzyskaniu tokena weryfikacyjnego możesz nawiązać połączenie z
/oauth1/access
uż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_signature
generowania:https://oauth1.wp-api.org/docs/basics/Signing.html
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/
źródło
oauth_signature
jak powiedziałeś, ale jakoś odpowiedź jest zawszejson_oauth1_signature_mismatch
.Aktualizacja: Z tego, co przeczytałem, musisz zrobić wiele loków, aby uzyskać access_token, którego następnie używasz do wykonania zapytania
Przepływ serwera oauth1
źródło
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:
Oto bardziej konkretny przykład:
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
i zostawiłem pw puste. To zależy od systemu API, którego używasz.
źródło