Tengo dos instancias de AWS, una para el sitio web de WordPress y otra para la aplicación React. Para conectarlos, estoy usando “WP REST API – OAuth 1.0a Server” y “JWT Authentication for WP-API” para acceder a WP REST API.
Soy capaz de generar token por /wp-json/jwt-auth/v1/token
pero cuando estoy tratando de acceder a cualquier otro punto final o si intento validar el token por /wp-json/jwt-auth/v1/token/validate
Recibo el siguiente error:
{
"code": "jwt_auth_no_auth_header",
"message": "Authorization header not found.",
"data": {
"status": 403
}
}
Miré hacia arriba y encontré algunas cosas para agregar .htaccess
. Agregué todo lo que pude encontrar pero no tuve éxito.
RewriteEngine On
RewriteBase /
# Enable HTTP Auth
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
# WordPress
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# For SetEnvIf Authorization
#RewriteRule (.*) - [env=myenv:1]
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
#SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0
Agregué el siguiente código para ver si hay algún encabezado de autorización presente en la solicitud, pero no hay ninguno
add_filter( 'rest_pre_dispatch', 'prefix_show_request_headers', 10, 3 );
function prefix_show_request_headers( $result, $server, $request ) {
$result = $request->get_headers();
return $result;
}
Aquí (https://github.com/Tmeister/wp-api-jwt-auth/issues/6) Leí que WordPress tal vez esté tratando de autenticarse a través del método de cookies de forma predeterminada y arroja un error y no alcanza la autenticación JWT, así que agregué este fragmento de código pero aún no tuve éxito.
add_filter( 'rest_authentication_errors', '__return_true' );
Por último, agregué el complemento “JSON Basic Authentication” que también envía nombre de usuario: contraseña en los encabezados y funciona. Por lo tanto, no estoy seguro de si se trata de un problema con la eliminación de encabezados. Como no se recomienda para el servidor de producción, necesito la autenticación JWT para que funcione.
Cualquier ayuda es apreciada.
Estaba enfrentando el mismo problema, hasta que cambié el orden de las líneas en mi htaccess. Inicialmente, puse las líneas
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
al final de las reglas.
Después de esas líneas donde solo después de RewriteEngine On, se solucionó el error jwt_auth_no_auth_header. En la autenticación jwt para wp rest api
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
-
Esto funciona pero WordPress está modificando automáticamente mis htacces
– Alok Rajasukumaran
18 oct 2018 a las 6:55
-
eso es genial salvar mi día. gracias. lo hice muchas veces y no tenía conocimiento sobre esta importante configuración
– saber tabatabaee yazdi
5 de febrero de 2019 a las 15:25
akash joshi
En caso de que alguien más enfrente este problema, este código que agregué a .htaccess
probablemente no esté funcionando
# Enable HTTP Auth
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
Así que en el archivo del complemento jwt-authentication-for-wp-rest-api/class-jwt-auth-public.php
busca en la función nombrada validate_token
después de la $auth
la verificación falla, agregué este fragmento de código:
if (!$auth) {
$allHeaders = getallheaders();
$auth = isset($allHeaders['Authorization']) ? $allHeaders['Authorization'] : false;
}
Esto conseguirá eso Authorization
el encabezado y JWT funcionarán como se esperaba
-
Esto me ayudó mucho. Para evitar un error de índice indefinido, puede hacer lo siguiente:
$auth = isset($allHeaders['AUTHORIZATION']) ? $allHeaders['AUTHORIZATION'] : false;
–Steve Kim
31 de diciembre de 2017 a las 20:54
-
¡Gracias @steveKim! Respuesta actualizada.
– Akash Joshi
1 de enero de 2018 a las 9:29
-
Tenga en cuenta que la función getallheaders() no existe en Nginx, PHP-FPM o cualquier otro método FastCGI para ejecutar PHP. Puede ser pollyfill. Consulte stackoverflow.com/a/41427998/1298923
– usuario1298923
23 de marzo de 2021 a las 10:06
Intenté todo lo mencionado anteriormente y no logré que funcionara hasta que revisé mis complementos instalados y descubrí que tengo dos complementos: uno llamado “JWT Auth” y el otro: “JWT autenticación para WP-API”. Cuando desactivé “JWT Auth”, todo funcionó bien. No sé la razón, pero parece que hay algún tipo de conflicto entre los dos.