Como fazer solicitações autenticadas por JWT à API do Wordpress

17

Esta não é realmente uma pergunta, mas um guia sobre como fazer solicitações autenticadas para a API do Wordpress usando o JWT. Estou escrevendo isso como um lembrete para mim e para aqueles que precisam de ajuda com o mesmo tópico.

grazianodev
fonte
3
Você deve formatar isso como uma pergunta e postar a solução como uma resposta real. Caso contrário, parece uma pergunta sem resposta.
26630 Jacob Peattie #
2
Há também este guia fino firxworx.com/blog/wordpress/…
Armando

Respostas:

19

Por que autenticação JWT

Estou construindo um site que usa o Wordpress como back-end e um aplicativo React + Redux como front-end, por isso estou puxando todo o conteúdo do front-end fazendo solicitações à API do Wordpress. Algumas solicitações (principalmente solicitações POST) devem ser autenticadas, e foi quando me deparei com o JWT.

O que precisamos

Para usar a autenticação JWT com o Wordpress, primeiro precisamos instalar o plugin JWT Authentication for WP REST API . Como é explicado nas instruções do plugin, também precisamos modificar alguns arquivos principais do Wordpress. Em particular:

No arquivo .htaccess incluído na pasta raiz da instalação do Wordpress, precisamos adicionar as seguintes linhas:

RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]

No arquivo wp-config.php, também incluído na pasta raiz da instalação do Wordpress, precisamos adicionar estas linhas:

define('JWT_AUTH_SECRET_KEY', 'your-top-secret-key'); // Replace 'your-top-secret-key' with an actual secret key.
define('JWT_AUTH_CORS_ENABLE', true);

Testando para ver se o JWT está disponível

Para verificar se agora podemos usar o JWT, inicie o Postman e faça uma solicitação para o 'índice' padrão da API do Wordpress:

http://example.com/wp-json/

Alguns novos pontos de extremidade, como /jwt-auth/v1e /jwt-auth/v1/tokendeveriam ter sido adicionados à API. Se você puder encontrá-los na resposta à solicitação acima, isso significa que o JWT está agora disponível.

Obtendo o token JWT

Vamos ficar no Postman por enquanto e solicitar um token para a API do Wordpress:

http://example.com/wp-json/jwt-auth/v1/token

A resposta conterá o token JWT, que é uma chave criptografada que se parece com isso:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODg4OFwvZm90b3Jvb20tbmV4dCIsImlhdCI6MTUyMjU5NzQ1MiwibmJmIjoxNTIyNTk3NDUyLCJleHAiOjE1MjMyMDIyNTIsImRhdGEiOnsidXNlciI6eyJpZCI6IjEifX19.hxaaT9iowAX1Xf8RUM42OwbP7QgRNxux8eTtKhWvEUM

Fazendo uma solicitação autenticada

Vamos tentar alterar o título de uma postagem com um ID 300 como exemplo de uma solicitação autenticada com o JWT.

No Postman, escolha POST como o método e digite o seguinte ponto de extremidade:

http://example.com/wp-json/wp/v2/posts/300

Escolha Sem autenticação na guia Autorização e adicione o seguinte na guia Cabeçalhos:

'Content-type': 'application/json', 
'Authorization': 'Bearer jwtToken' // Replace jwtToken with the actual token (the encrypted key above)

Por fim, na guia Corpo, selecione as opções brutas e JSON (application / json) e, no editor logo abaixo das opções, digite o seguinte:

{ "title": "YES! Authenticated requests with JWT work" }

Agora você pode pressionar ENVIAR. Procure na guia de resposta todos os dados sobre a postagem que solicitamos: o valor da chave do título agora deve serYES! Authenticated requests with JWT work

grazianodev
fonte
2
Como você distinguiria as chamadas que devem ser autenticadas e as que não precisam ser autenticadas no back-end?
uruk
Também estou criando um aplicativo React que extrai os dados das postagens do banco de dados do WordPress usando a API REST do WordPress; no entanto, não quero que os pontos de extremidade da API REST estejam disponíveis publicamente. Existe uma maneira de restringir o acesso à API REST, exceto para o meu aplicativo React?
31718 Chris
@ Chris Se você quer que seus endpoints a ser escondido solicitações não autorizadas, adicioná-los sob o namespace jwt_auth, isto é assim: register_rest_route( 'jwt-auth/v1', 'your_custom_endpoint ... . Qualquer coisa sob / jwt-auth / terão autorização
Athoxx
3

Complementando a resposta de @ grazianodev, é assim que você obtém seu token de autorização usando cURL:

/**
*   Generate a JWT token for future API calls to WordPress
*/
private function getToken() {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL,'https://site.localhost/wp-json/jwt-auth/v1/token');
    curl_setopt($ch, CURLOPT_POST, 1);

    # Admin credentials here
    curl_setopt($ch, CURLOPT_POSTFIELDS, "username=admin&password=Str0ngPass"); 

    // receive server response ...
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $server_output = curl_exec ($ch);
    if ($server_output === false) {
        die('Error getting JWT token on WordPress for API integration.');
    }
    $server_output = json_decode($server_output);

    if ($server_output === null && json_last_error() !== JSON_ERROR_NONE) {
        die('Invalid response getting JWT token on WordPress for API integration.');
    }

    if (!empty($server_output->token)) {
        $this->token = $server_output->token; # Token is here
        curl_close ($ch);
        return true;
    } else {
        die('Invalid response getting JWT token on WordPress for API integration.');
    }
    return false;
}

Depois disso, envie suas solicitações com o cabeçalho: "Autorização: token $ do portador"

Onde $ token é o token retornado pela função getToken () acima.

Pessoalmente, uso o plug-in " Desativar API REST e exigir autenticação JWT / OAuth " para restringir o acesso à API apenas com o token acima.

Lucas Bustamante
fonte