[SOLUCIONADO]Autenticación en G3w

Hola, tengo esta situación:
Versión 2.9.4
Cuando intento hacer el login al sistema (método estándar, usuario y contraseña), no me validan las credenciales de usuario.
en lugar del método POST está llegando el request como GET y no se donde se configura ese método.
Puse algunas depuraciones en la clase del modelo que hace la autenticación (auth_form.php) y llega a ejecutar el método autenticar() pero el valor devuelto por:

$metodo = kernel::request()->getMethod();

Es:

Array
(
    [metodo] => GET
)

y por lo tanto no entra en la condición para autenticar, ya que se hace la comparación:

if (kernel::request()->isPost()) {
....
....
return $this->id_persona = $this->validar_user_pass($usuario, $pass);
....
}

Si se inspecciona la página generada se visualiza el método del form:

<script type='text/javascript'>kernel.renderer.on_arrival({"css":["\/guarani\/rs.php\/__ignored__\/acceso\/login\/default.css?ns=siu"],"js":["\/guarani\/rs.php\/acceso\/login\/pagelet_login.js"],"op":"acceso","info":{"id":"login","visible":"1","estado":"inicial","mensajes":{"id_requerido":"El nombre de usuario es requerido. <br\/>Por favor intenta de nuevo.","clave_requerida":"La contrase\u00f1a es requerida. <br\/>Por favor intenta de nuevo."}},"content":"<h2>Ingres\u00e1 tus datos<\/h2>[b]<form method=\"post\" action=\"http:\/\/url_g3w0\/guarani\/acceso?auth=form[/b]\" id=\"guarani_form_login\"><div class=\"control-group\"><label class=\"control-label\" for=\"usuario\">Usuario<\/label><div class=\"controls\"><input id=\"usuario\" name=\"usuario\" type=\"text\" value=\"\" maxlength=\"20\"\/><\/div><\/div><div class=\"control-group\"><label class=\"control-label\" for=\"password\">Clave<\/label><div class=\"controls\"><input id=\"password\" name=\"password\" type=\"password\" value=\"\" maxlength=\"20\"\/><\/div><\/div><div class=\"control-group\"><div class=\"controls\"><input id=\"recaptcha_challenge_field\" name=\"recaptcha_challenge_field\" type=\"hidden\" value=\"\" \/><input id=\"recaptcha_response_field\" name=\"recaptcha_response_field\" type=\"hidden\" value=\"\" \/><input id=\"login\"  name=\"login\" type=\"submit\" value=\"Ingresar\" class=\"btn btn-info\"\/><\/div><\/div><\/form><a href='http:\/\/url_g3w\/guarani\/acceso\/recuperar'>\u00bfOlvidaste tu contrase\u00f1a o sos un usuario nuevo?<\/a>","clase_js":"login","tiene_archivo_js":"1"});</script><script type='text/javascript'>kernel.renderer.on_arrival({"css":["\/guarani\/rs.php\/__ignored__\/acceso\/contenido_login\/default.css?ns=siu"],"js":["\/guarani\/rs.php\/acceso\/contenido_login\/pagelet_contenido_login.js"],"op":"acceso","info":{"id":"contenido_login","visible":"1","estado":"inicial","mensajes":[]},"content":"<h2>SIU Guaran\u00ed<\/h2><p>Algunas de las cosas que pod\u00e9s hacer con este sistema son:<\/p><ul><li>Inscribirte a materias y ex\u00e1menes.<\/li><li>Consultar el plan de tu carrera.<\/li><li>Consultar tu historia acad\u00e9mica.<\/li><li>Actualizar tus datos personales.<\/li><li>Recibir alertas sobre per\u00edodos de inscripci\u00f3n o vencimiento de ex\u00e1menes finales.<\/li><\/ul>","clase_js":"contenido_login","tiene_archivo_js":"1"});</script><script type='text/javascript'>kernel_config.pagelet_count = 2</script>

Adjunto el log con la salida de las depuraciones

Gracias


porcion_log.txt (591 Bytes)

Hola Damian,

En el archivo src/siu/operaciones/acceso/login/default.twig fíjate que dice method=“post”:


<form method="post" action="{{ form.accion }}" id="guarani_form_login">

¿lo tenes así o esta personalizado?

action=“{{ form.accion }}” lo podes ver en la función get_modelo de src/siu/modelo/autenticacion/auth_form.php:

$datos['accion'] = kernel::vinculador()->crear('acceso', 'index', array('auth' => 'form'));

En instalacion/config.php podes configurar los logs en nivel “debug” para que muestre mas información en los mismos.

En el navegador podes hacer un “Inspeccionar elemento” del form login para ver el atributo method y action.

saludos.
2

Hola Leonel, gracias por responder.
No está personalizado el proyecto, el archivo de configuración está así:

 'accesos' =>
                array (
                    'des01' =>
                        array (
                            'ua' => 'UA',
                            'personalizacion' => NULL,
.....

Efectivamente el archivo src/siu/operaciones/acceso/login/default.twig dice:

<form method="post" action="{{ form.accion }}" id="guarani_form_login">

También puedo confirmar que el archivo src/siu/modelo/autenticacion/auth_form.php en su método get_modelo() dice:

$datos['accion'] = kernel::vinculador()->crear('acceso', 'index', array('auth' => 'form'));

Con respecto a los logs, tengo en el config.php:

'log' =>
                array (
                    'activo' => true,
                    'nivel' => 'debug',
                    'barra_dev' => true,
                ),
            'ini_debug' => false,

Pero, curiosamente no muestra la barra de desarrollo.
Esto es lo que muestra la opción inspeccionar elemento:

<form method="post" action="http://url_g3w/guarani/acceso?auth=form" id="guarani_form_login"><div class="control-group"><label class="control-label" for="usuario">Usuario</label><div class="controls"><input id="usuario" name="usuario" type="text" value="" maxlength="20"></div></div><div class="control-group"><label class="control-label" for="password">Clave</label><div class="controls"><input id="password" name="password" type="password" value="" maxlength="20"></div></div><div class="control-group"><div class="controls"><input id="recaptcha_challenge_field" name="recaptcha_challenge_field" type="hidden" value=""><input id="recaptcha_response_field" name="recaptcha_response_field" type="hidden" value=""><input id="login" name="login" type="submit" value="Ingresar" class="btn btn-info"></div></div></form>

Adjunto el log completo luego de presionar el botón ingresar.

Gracias


log_acceso_g3w_ua.txt (4.88 KB)

Hola Damian, gracias por los logs!!!

Si antes de iniciar sesión haces un “Inspeccionar elemento” en el navegador y vas a la solapa red, ¿te muestra una petición con status 302 como en la captura?

Te pediría que en la función autenticar de la clase src/siu/modelo/autenticacion/auth_form.php agregues esto arriba de todo, luego volve a intentar iniciar sesión y envíame los logs:


	public function autenticar()
	{
		
		$metodo = kernel::request()->getMethod();
		$post = kernel::request()->getPost();
		klog2("metodo", $metodo);
		klog2("post", $post);
		klog2("debug_backtrace", debug_backtrace());

                ***************
	}

saludos.
2


Screenshot from 2021-04-28 14-42-48.png

Screenshot from 2021-04-28 14-42-48.png

Hola Leonel, en la inspección del elemento antes de intentar hacer el login, solapa red, no tengo petición alguna con estado 302, todas 200, una con estado 404 (favicon.ico)
http://url_g3w/guarani/acceso/?__o=acceso&auth=form (status 200)
http://url_g3w/guarani/acceso/favicon.ico (status 404)
El resto todas 304 y 200
Va adjunto el log con los debug.
Gracias


20210428_171419___2372.txt (13.5 KB)

Hola Damian, gracias por la información!!!

Por lo que veo en los logs hace bien el “camino”, va a la función autenticar de src/siu/lib/kernel/acceso/login_manager.php, y luego a autenticar de src/siu/modelo/autenticacion/auth_form.php, pero esta ultima falla.

Probemos lo siguiente:

  1. Probemos lo que dice este hilo, en src/siu/operaciones/acceso/login/default.twig:
    Cambia esto:
<input id="login"  name="{{ form.campos.submit.name }}" type="{{ form.campos.submit.type }}" value="{{ form.campos.submit.value }}" class="btn btn-info"/>

por esto:

<input id="login"  name="{{ form.campos.submit.name }}" type="{{ form.campos.submit.type }}" value="{{ form.campos.submit.value }}" class="btn btn-info" formmethod="post" formaction="{{ form.accion }}"/>
  1. Si con el punto 1) no funciona, en src/siu/operaciones/acceso/login/pagelet_login.js comenta el evento submit, quizás eso este generando problemas.

saludos.
4

Hola Leonel, gracias por la ayuda.
Ninguno de los métodos hizo que funcione.
Luego de intentar hacer el login escribiendo el usuario y contraseña, luego presionando en ingresar, la consola del navegador emite esta advertencia:

A form was submitted in the windows-1252 encoding which cannot encode all Unicode characters, so user input may get corrupted. To avoid this problem, the page should be changed so that the form is submitted in the UTF-8 encoding either by changing the encoding of the page itself to UTF-8 or by specifying accept-charset=utf-8 on the form element. guarani

Si le pido la descripción del archivo al servidor me devuelve:

text/x-php; charset=iso-8859-1

Por si esto tiene algo que ver

Hola Damian,

Si con eso no funcionó podes revertir los cambios que te dije que hagas en la respuesta #5, el JS solamente hace validaciones.

Probemos lo que te dice el siguiente mensaje:

A form was submitted in the windows-1252 encoding which cannot encode all Unicode characters, so user input may get corrupted. To avoid this problem, the page should be changed so that the form is submitted in the UTF-8 encoding either by changing the encoding of the page itself to UTF-8 or by specifying accept-charset=utf-8 on the form element. guarani

En el archivo src/siu/operaciones/acceso/login/default.twig agregale accept-charset=“utf-8” al tag .

Otra cosa, yo recuerdo que en G3 arreglamos un problema similar, el problema venia por tener caracteres especiales en la URL, ¿como es la URL que tienen en 3W?

saludos.
2

Hola Leonel, se aplica el atributo al tag , pero sigue con el mismo comportamiento.
La url de acceso a 3W es:

http://ip_server_web:8010/guarani/

Luego del intento fallido de login vuelve a:

http://ip_server_web:8010/guarani/acceso/?__o=acceso&auth=form

Saludos

Hola Damian, gracias por la información!!!

La URL no tiene ningún carácter extraño, así que descartamos que sea por eso!!!

Pregunta, ¿llega a entrar a la función autenticar_usuario_clave de la clase src/siu/modelo/autenticacion/fuente_usuarios_guarani.php?

¿Esto te pasa con todos los usuarios?
¿esta bien la contraseña del usuario?

Si es posible elimina todos los logs, volvé a intentar iniciar sesión, y pasame los logs nuevos que genera, seguramente es mas de un archivo ya que debe estar haciendo una redirección.

saludos.
2

Hola Leonel, gracias por contestar.
No llega a entrar a la función, porque nunca da verdadera la condición de

if (kernel::request()->isPost())

del método autenticar() de la clase auth_form.php.
Borré todos los archivos y al intentar hacer login solo genera dos archivos. Van adjuntos
Gracias


20210503_183101___8348.txt (4.31 KB)

20210503_183134___9312.txt (12.6 KB)

Hola Damian, gracias por los logs!!!

Me suena a que tenes una redirección en el medio que te convierte la petición de POST a GET.

¿Vos podes probar el login con Postman o alguna otra aplicación para probar peticiones?
Vas a tener que desactivar el captcha para poder probarlo, ej:


Method: POST
URL: <URL-3W>/acceso?auth=form
FORM DATA:
usuario=pepe
password=123456789*-a
login=Ingresar

Referencias:
https://www.javaer101.com/en/article/16005052.html
https://stackoverflow.com/questions/41619113/php-request-method-post-turns-into-get
https://github.com/guzzle/guzzle/issues/1788
https://github.com/postmanlabs/postman-app-support/issues/450

saludos.
2

Hola Leonel, aparentemente si, alguien cambia el método. No se como encontrar quien lo hace
Probé con Postman con credenciales válidas. en el access.log del server web se visualiza:

[06/May/2021:17:21:18 -0300] "POST /guarani/acceso?auth=form HTTP/1.1" 301 357 "-" "PostmanRuntime/7.28.0"
 [06/May/2021:17:21:18 -0300] "GET /guarani/acceso/?__o=acceso&auth=form HTTP/1.1" 200 8509 "http://ip_server:port/guarani/acceso?auth=form" "PostmanRuntime/7.28.0"

La salida del postman va adjunto.
Gracias


salida_postman_foro.txt (7.71 KB)

Hola Damian, gracias por la información!!!

Claro, ahí esta el problema, la cuestión ahora es ver donde se hace esa redirección!!!

Preguntas,

¿vos tenes modificados los archivos instalacion/alias.conf o instalacion/rewrite.conf?
¿usas Apache con proxy reverso?
¿haces redirect de http a https?

Te dejo unos posts que les pasan lo mismo:

https://stackoverflow.com/questions/26728231/post-request-getting-converted-to-get-when-url-rewriting-is-done-in-apache-httpd

https://softwareengineering.stackexchange.com/questions/99894/why-doesnt-http-have-post-redirect/99966#99966

https://stackoverflow.com/questions/10586779/redirectmatch-changes-post-to-get

saludos.
2

Seguí viendo un poco mas y encotré esto:

Causas: Redirección de http a https (https://social.msdn.microsoft.com/Forums/lync/en-US/68569613-74d3-4e5a-ae30-d5253a536c0c/post-request-turns-into-get?forum=AzureAPIApps).

¿tenes algo así en algún lugar (mod rewrite - POST request getting converted to GET when URL rewriting is done in apache httpd - Stack Overflow)?


# redirecting old URL to new URL
RewriteRule ^/contextRoot(.*)$ https://mydomain.com$1 [L,R=301]

Hay posts que sugieren STATUS CODE 307 en lugar de 301 para redirigir, ya que 307 mantiene el método HTTP (POST en este caso).

In HTTP 1.1, there actually is a status code (307) which indicates that the request should be repeated using the same method and post data.

As others have said, there is a potential for misuse here which may be why many frameworks stick to 301 and 302 in their abstractions.

saludos.
2

Hola Leonel, el administrador del servidor web encontró la redirección en el servicio.
Gracias por toda la ayuda, sin esta no podrían haber llegado a la solución.
Saludos

Gracias Leonel y gracias Damián!!

Con el esfuerzo de Damián y la ayuda de Leonel, Freddy pudo “iluminarse” y encontrar el problema y solucionarlo.

Saludos

Gustavo

Hola, me alegro que hayan podido encontrar la solución!!!

Un abrazo!!!
2