Estou tentando usar a API de descanso do WordPress com autenticação para obter mais dados da API. Instalei o plug-in Oauth, o plug-in rest-api e obtive credenciais de API do WP-CLI.
Eu descobri como acessar dados sem autorização. Isso funciona:
// 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>
Mas não consigo descobrir como autenticar com credenciais. Aqui está a minha tentativa. Não tenho certeza se "chave" e "segredo" estão corretas.
// 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>
A saída é
Array
(
[code] => rest_cannot_read
[message] => Sorry, you cannot view revisions of this post.
[data] => Array
(
[status] => 401
)
)
Como posso fazer isso funcionar? Obrigado.
authentication
rest-api
curl
JediTricks007
fonte
fonte
Respostas:
Vamos passo a passo aqui. Parece que você está tentando usar o OAuth apenas para autenticação, mas para poder fazer isso, é necessário obter o token de acesso, que será usado para autenticar quando você fizer suas chamadas de API.
Como está usando o OAuth versão 1, para obter o token de acesso, faça o seguinte:
Eu recomendo usar o Postman para as primeiras etapas, porque elas precisam ser concluídas apenas uma vez. O Postman também manipulará a geração de
timestamp
,nonce
eoauth signature
, portanto, se você não estiver usando uma biblioteca OAuth, deverá usar absolutamente o Postman. Depois de ter seu token de acesso, você poderá fazer chamadas via CURL sem nenhuma biblioteca.https://www.getpostman.com/
Primeira etapa (aplicativo de configuração)
Instale o plug-in WP OAuth 1, ative e vá para o item de menu em Usuários> Aplicativos . Adicione um novo aplicativo, preencha o nome e a descrição. Para retorno de chamada, o URL para o qual redirecionar o usuário (após a autorização) ou
oop
fluxo Out-of-Band que será redirecionado para uma página interna que exibe o token do verificador (em vez de redirecionar).https://github.com/WP-API/OAuth1/blob/master/docs/basics/Registering.md
Para prosseguir para a segunda etapa, é necessário fazer uma chamada para o seu site, usando o ID do cliente e o Segredo do cliente do do aplicativo criado, para obter credenciais temporárias (Request Token).
Abra o Postman, crie uma nova chamada para
http://website.com/oauth1/request
, clique na guia Autorização, selecione OAuth 1.0 no menu suspenso, digite a Chave do cliente, Segredo do cliente, defina o método de assinatura comoHMAC-SHA1
, habilite adicionar parâmetros ao cabeçalho, codifique a assinatura oauth e clique em Atualizar solicitaçãoO Postman gera automaticamente a assinatura, o nonce e o carimbo de data e hora para você e os adiciona ao cabeçalho (você pode visualizar na guia Cabeçalhos).
Clique em Enviar e você deverá obter uma resposta que inclua
oauth_token
eoauth_token_secret
:Esses valores serão usados na próxima etapa para autorizar o aplicativo em sua conta de usuário do WordPress.
Segunda etapa (autorizar inscrição)
A etapa de autorização precisa ser concluída apenas uma vez; essa etapa é voltada para o usuário e aquela que todos estão familiarizados. Esta etapa é necessária porque você está usando o OAuth1 e o aplicativo precisa estar associado a uma conta de usuário do WordPress. Pense em quando um site permite que você faça login no Facebook ... eles o direcionam para o Facebook onde você faz login e clica em "Autorizar" ... isso precisa ser feito, apenas através do seu site WordPress.
Eu recomendo usar o navegador da Web para esta etapa, pois você pode facilmente definir as variáveis no URL, e isso fornece a página "Autorizar" para autorizar o aplicativo.
Abra seu navegador da web e digite o URL do seu site, assim:
http://website.com/oauth1/authorize
Agora adicione este URL
oauth_consumer_key
(ID do cliente)oauth_token
eoauth_token_secret
(da etapa anterior). No meu exemplo, este é o URL completo:Depois de clicar em Autorizar, você receberá outra tela com o token de verificação. No meu exemplo, este é o token de verificação retornado
E0JnxjjYxc32fMr2AF0uWsZm
Terceira etapa (obter token de acesso)
Agora que autorizamos o aplicativo, precisamos fazer uma última chamada para obter o Token de Autorização, que será usado para fazer todas as suas chamadas de API. Assim como o primeiro passo, vou usar o Postman (porque é necessário que a assinatura seja o HMAC-SHA1) e torna 100x mais fácil concluir essas etapas.
Abra o Postman novamente e altere o URL para
http://website.com/oauth1/access
Certifique-se de adicionar o Token e o Token Secret (valores da primeira etapa) e clique em Params para mostrar as caixas abaixo da URL. À esquerda, digite oauth_verifier e à direita, digite o código da segunda etapa, o Token de Verificação
Certifique-se de clicar em Solicitação de atualização, clique em Enviar e você deverá receber uma resposta novamente com ...
oauth_token
eoauth_token_secret
é com isso que você precisa fazer suas chamadas de API! Descarte os originais da etapa 1, salve-os no seu código ou em outro lugar seguro.Você pode fazer uma chamada de API ao seu site, definindo os cabeçalhos com o token retornado e o segredo do token.
Você pode passar isso de várias maneiras, via cabeçalho de autorização, nos parâmetros GET ou POST (se codificado como application / x-www-form-urlencoded). Lembre-se de que DEVE passar a assinatura, o carimbo de data e hora e o nonce. Não sabia quanto tempo essa resposta levaria, então atualizarei isso amanhã com um exemplo de como fazer isso com seu código.
Eu recomendo fortemente a instalação do log da API Rest, para que você possa visualizar o log das chamadas da API e ver o que foi enviado, retornado etc. Isso ajudará na depuração tremendamente.
https://github.com/petenelson/wp-rest-api-log
fonte
Adicionando isso como outra resposta para ajudar você a descobrir como fazer isso. Basicamente, como mencionado nos meus comentários, se você for usar o OAuth1, DEVE associá-lo a uma conta de usuário, sem contornar isso.
Primeiro, você precisa usar o CURL para fazer login no site com uma senha de nome de usuário para WordPress, armazenar o cookie para poder usá-lo na sua chamada CURL para OAuth (atualize sua chamada CURL para incluir o cookie):
/programming/724107/wordpress-autologin-using-curl-or-fsockopen-in-php
Em seguida, faça a chamada para o OAuth usando CURL com o ID do cliente e o segredo do cliente, para obter o token e o segredo temporários do oauth (Request Token)
Para fazer esta chamada (e a chamada para obter o token de acesso), você precisa configurar sua chamada CURL corretamente. Veja o final desta resposta para código e referências.
Depois de obter o token e o segredo temporários oauth (Request Token), faça uma chamada CURL POST para este URL do seu site:
http://website.com/oauth1/authorize
Você precisará puxar todos os valores do HTML retornado para a página de autorização e, em seguida, enviar seu próprio POST para o URL da ação do formulário.
/programming/35363815/how-to-get-a-value-input-from-html-returned-of-curl
Especificamente, eles precisam ser incluídos nos dados do POST para concluir a "autorização" do POST para
http://domain.com/wp-login.php?action=oauth1_authorize
_wpnonce
- Este é o valor nonce para o formulário a ser enviado, DEVE ser extraído da entrada HTML e enviado com o seu POSTconsumer
- Esta é uma entrada oculta no HTML (é uma referência a um ID da postagem, portanto você deve retirá-la da entrada HTMLoauth_token
- Esta é uma entrada oculta no HTML (mas você também já deve ter)wp-submit
- Isso precisa ser definido como o valorauthorize
Aqui está um exemplo de HTML gerado para a página de autenticação:
Depois de fazer o POST com todos esses valores / dados, este é o HTML que será retornado com o código de autorização (portanto, você precisará extrair o valor de dentro do
<code>
bloco:Depois de ter o token de verificação, você poderá fazer uma chamada para
/oauth1/access
usar o token de verificação, o token oauth e o segredo do token oauth. O token de verificação precisa ser inserido nos dados do POST comooauth_verifier
Isso retornará seu novo e permanente token de acesso e o VOILA!
Exemplo de código CURL
Abaixo está um código de exemplo para fazer a chamada CURL, sendo a parte mais importante a forma como ela
oauth_signature
é gerada:https://oauth1.wp-api.org/docs/basics/Signing.html
Este site mostra exatamente como codificar a assinatura OAuth e como enviar usando CURL (eu recomendo a leitura da página inteira): https://hannah.wf/twitter-oauth-simple-curl-requests-for-your-own- dados/
Mais recursos na geração de assinatura OAuth1: /programming/24613277/oauth-signature-generation-using-hmac-sha1
Outros recursos: http://collaboradev.com/2011/04/01/twitter-oauth-php-tutorial/
fonte
oauth_signature
como você disse, mas, de alguma forma, a resposta é semprejson_oauth1_signature_mismatch
.Atualização: pelo que li, você precisa fazer vários cachos para obter o access_token, que você usa para fazer a consulta
fluxo do servidor oauth1
fonte
Eu sei que vou entrar nisso um pouco tarde, mas você pode usar wp_remote_get e _post?
Estou puxando e publicando conteúdo com minha instalação do wordpress usando-os:
Esta é a ideia geral do códice wordpress:
Aqui está um exemplo mais específico:
O truque é codificar o nome de usuário e o pw. Agora, muitas vezes o tempo, dependendo do nome de usuário da API e do pw, ficará em branco ou será o seu tokens.
Por exemplo, no meu exemplo específico acima, os cabeçalhos foram
e eu deixei pw em branco. Isso depende do sistema de API que você está usando.
fonte