jwt_auth_no_auth_header error al validar el token JWT API REST de WordPress

3 minutos de lectura

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


avatar de usuario
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.phpbusca en la función nombrada validate_tokendespué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.

¿Ha sido útil esta solución?