Estoy buscando la API que me permita iniciar sesión en un usuario pasándole el nombre de usuario y la contraseña. ¿Alguien tiene experiencia con esto?
Para aclarar, estoy tratando de hacer un cuadro de inicio de sesión AJAX que aparezca como una ventana emergente en la página de inicio, y no actualice la página en caso de credenciales incorrectas, pero solo si el inicio de sesión es correcto. Entonces, esto es lo que he hecho hasta ahora:
Actualizar
Ahora cargo el formulario de inicio de sesión en mi página de inicio, luego, al enviarlo, lanzo una solicitud AJAX que envía credenciales a este script:
function user_login_submit_try() {
global $user;
$uid = user_authenticate($_POST['name'],$_POST['pass']);
$arr = array ('name'=>$_POST['name'],'pass'=>$_POST['pass']);
if ($uid){
$user = user_load($uid);
user_login_finalize($arr);
}
echo drupal_json_encode($uid);
exit;
};
Hasta ahora funciona, pero mis preocupaciones son (como lo menciona googletorp) problemas de seguridad; parece que ninguna de las API que utilicé en este script desinfectó los datos de ninguna manera.
¿Alguien vería una mejor manera de hacerlo?
Respuestas:
Esto podría ayudar a alguien:
Una mejor versión basada en el comentario:
fuente
hook_user_insert
pero las funciones anteriores en la respuesta quieren la contraseña como texto plano original. Creo que voy a necesitar para tratarhook_form_alter
su lugar ...No hay una función API simple para eso.
Puedes hacer lo que hace Drupal:
Sobrescribir el
global $user
.Manejar sesiones
Para el paso dos y 3 ver
user_login_submit()
Todas estas funciones se basan en ser llamadas desde un formulario. El flujo normal es que los manejadores de validación prueban la entrada de los usuarios y devuelven el uid del usuario si la validación pasa. El controlador de envío maneja el inicio de sesión real del usuario y el enlace del usuario llamante.
fuente
$form_state['value']['name'] = $_POST['name']
y así sucesivamente ..$form_state
variable. Hay muchas comprobaciones de seguridad agradables que de otro modo perdería y posiblemente abriría su sitio para ataques. Cuando se trata de iniciar sesión en un usuario, no desea perder esa seguridad.Si necesita obtener el objeto de usuario para la cuenta de usuario para la que conoce el nombre de usuario y la contraseña, puede usar el siguiente código:
$account
seráFALSE
si el objeto de usuario no se puede encontrar o cargar.Debe usar este código cuando, por ejemplo, su módulo obtiene el nombre de usuario y la contraseña como entrada de un usuario, verifica si son correctos y luego hace algo con el objeto de usuario.
Si está escribiendo un módulo que necesita hacerse pasar por un usuario para escribir un comentario, o está haciendo otra cosa que debe resultar como lo hizo un usuario, que es lo que hace el módulo de seguimiento de problemas del proyecto al cerrar un informe de problemas que ha estado en el estado fijo durante dos semanas (en ese caso, agrega el comentario "Automáticamente cerrado - problema solucionado por 2 semanas sin actividad" que resulta escrito por el usuario "Mensaje del sistema"), entonces no necesita nombre de usuario y contraseña. Simplemente carga el objeto de usuario para el que conoce la ID de usuario.
Hasta donde sé, no hay ningún problema de seguridad con el código que informé.
Es posible que desee limitar el número de inicios de sesión fallidos; o para bloquear temporalmente la IP que intenta iniciar sesión sin éxito, o intenta diferentes inicios de sesión en poco tiempo.
fuente
Este código realmente funciona
fuente
Respuesta limpia de lo anterior. La comprobación de usuario y contraseña es una característica adicional. Además, el form_state falso debe ser una variable que se pase por referencia a la función o arrojará un error.
Por lo tanto tenemos:
fuente
El usuario recibirá la sesión y también iniciará sesión en otras páginas:
fuente
A veces necesitamos un inicio de sesión rápido desde URL u Olvidé mi contraseña de administrador. Simplemente implemente a continuación dos funciones para iniciar sesión como usuario 1 en Drupal.
fuente