tutorial remember_token password custom create auth php authentication laravel laravel-4

php - remember_token - Laravel Auth: attempt() no persistirĂ¡



remember_token laravel (8)

He encontrado muchos recursos en línea con problemas similares, pero ninguna de las soluciones parece resolver mi problema.

Cuando registro un usuario con el siguiente código, todo parece estar bien:

$email = Input::get(''email''); $password = Input::get(''password''); if (Auth::attempt(array(''email'' => $email, ''password'' => $password))) { return Auth::user(); } else { return Response::make("Invalid login credentials, please try again.", 401); }

La función Auth::attempt() devuelve true y el usuario conectado vuelve al cliente usando Auth::user() .

Pero si el cliente realiza otra solicitud al servidor inmediatamente después, Auth::user() devuelve NULL .

Confirmé que las sesiones de Laravel funcionan correctamente al usar Session::put() y Session::get() exitosamente.

Actualizar

¡En investigaciones posteriores, parece que las sesiones tampoco persisten! ¿Podría ser esto algo relacionado con tener el servidor de la aplicación web AngularJS a través de la aplicación.mydomain.com y la API de Laravel a través de api.midominio.com?

Mi modelo de usuario es el siguiente:

<?php use Illuminate/Auth/UserInterface; use Illuminate/Auth/Reminders/RemindableInterface; class User extends Eloquent implements UserInterface, RemindableInterface { /** * The database table used by the model. * * @var string */ protected $table = ''users''; /** * The attributes excluded from the model''s JSON form. * * @var array */ protected $hidden = array(''password''); /** * Get the unique identifier for the user. * * @return mixed */ public function getAuthIdentifier() { return $this->getKey(); } /** * Get the password for the user. * * @return string */ public function getAuthPassword() { return $this->password; } /** * Get the e-mail address where password reminders are sent. * * @return string */ public function getReminderEmail() { return $this->email; } }

Mi configuración de autenticación es la siguiente:

<?php return array( /* |-------------------------------------------------------------------------- | Default Authentication Driver |-------------------------------------------------------------------------- | | This option controls the authentication driver that will be utilized. | This driver manages the retrieval and authentication of the users | attempting to get access to protected areas of your application. | | Supported: "database", "eloquent" | */ ''driver'' => ''eloquent'', /* |-------------------------------------------------------------------------- | Authentication Model |-------------------------------------------------------------------------- | | When using the "Eloquent" authentication driver, we need to know which | Eloquent model should be used to retrieve your users. Of course, it | is often just the "User" model but you may use whatever you like. | */ ''model'' => ''User'', /* |-------------------------------------------------------------------------- | Authentication Table |-------------------------------------------------------------------------- | | When using the "Database" authentication driver, we need to know which | table should be used to retrieve your users. We have chosen a basic | default value but you may easily change it to any table you like. | */ ''table'' => ''users'', /* |-------------------------------------------------------------------------- | Password Reminder Settings |-------------------------------------------------------------------------- | | Here you may set the settings for password reminders, including a view | that should be used as your password reminder e-mail. You will also | be able to set the name of the table that holds the reset tokens. | | The "expire" time is the number of minutes that the reminder should be | considered valid. This security feature keeps tokens short-lived so | they have less time to be guessed. You may change this as needed. | */ ''reminder'' => array( ''email'' => ''emails.auth.reminder'', ''table'' => ''password_reminders'', ''expire'' => 60, ), );

La migración utilizada para crear la tabla de users es la siguiente:

<?php use Illuminate/Database/Schema/Blueprint; use Illuminate/Database/Migrations/Migration; class CreateUsersTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create(''users'', function(Blueprint $table) { $table->increments(''id''); $table->string(''email'')->unique(); $table->string(''password''); $table->string(''first_name''); $table->string(''last_name''); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table(''users'', function(Blueprint $table) { // }); } }

Y la configuración de la sesión:

<?php return array( /* |-------------------------------------------------------------------------- | Default Session Driver |-------------------------------------------------------------------------- | | This option controls the default session "driver" that will be used on | requests. By default, we will use the lightweight native driver but | you may specify any of the other wonderful drivers provided here. | | Supported: "file", "cookie", "database", "apc", | "memcached", "redis", "array" | */ ''driver'' => ''database'', /* |-------------------------------------------------------------------------- | Session Lifetime |-------------------------------------------------------------------------- | | Here you may specify the number of minutes that you wish the session | to be allowed to remain idle before it expires. If you want them | to immediately expire on the browser closing, set that option. | */ ''lifetime'' => 120, ''expire_on_close'' => false, /* |-------------------------------------------------------------------------- | Session File Location |-------------------------------------------------------------------------- | | When using the native session driver, we need a location where session | files may be stored. A default has been set for you but a different | location may be specified. This is only needed for file sessions. | */ ''files'' => storage_path().''/sessions'', /* |-------------------------------------------------------------------------- | Session Database Connection |-------------------------------------------------------------------------- | | When using the "database" or "redis" session drivers, you may specify a | connection that should be used to manage these sessions. This should | correspond to a connection in your database configuration options. | */ ''connection'' => null, /* |-------------------------------------------------------------------------- | Session Database Table |-------------------------------------------------------------------------- | | When using the "database" session driver, you may specify the table we | should use to manage the sessions. Of course, a sensible default is | provided for you; however, you are free to change this as needed. | */ ''table'' => ''sessions'', /* |-------------------------------------------------------------------------- | Session Sweeping Lottery |-------------------------------------------------------------------------- | | Some session drivers must manually sweep their storage location to get | rid of old sessions from storage. Here are the chances that it will | happen on a given request. By default, the odds are 2 out of 100. | */ ''lottery'' => array(2, 100), /* |-------------------------------------------------------------------------- | Session Cookie Name |-------------------------------------------------------------------------- | | Here you may change the name of the cookie used to identify a session | instance by ID. The name specified here will get used every time a | new session cookie is created by the framework for every driver. | */ ''cookie'' => ''laravel_session'', /* |-------------------------------------------------------------------------- | Session Cookie Path |-------------------------------------------------------------------------- | | The session cookie path determines the path for which the cookie will | be regarded as available. Typically, this will be the root path of | your application but you are free to change this when necessary. | */ ''path'' => ''/'', /* |-------------------------------------------------------------------------- | Session Cookie Domain |-------------------------------------------------------------------------- | | Here you may change the domain of the cookie used to identify a session | in your application. This will determine which domains the cookie is | available to in your application. A sensible default has been set. | */ ''domain'' => null, /* |-------------------------------------------------------------------------- | HTTPS Only Cookies |-------------------------------------------------------------------------- | | By setting this option to true, session cookies will only be sent back | to the server if the browser has a HTTPS connection. This will keep | the cookie from being sent to you if it can not be done securely. | */ ''secure'' => false, );

¿Algunas ideas?



De acuerdo, no he profundizado en eso, pero me he dado cuenta de que laravel solo devuelve cookies a través de una conexión segura.

Como debe haber notado, laravel está configurando una cookie pero no está respondiendo a la configuración de por vida en session.php

/* |-------------------------------------------------------------------------- | Session Lifetime |-------------------------------------------------------------------------- | | Here you may specify the number of minutes that you wish the session | to be allowed to remain idle before it expires. If you want them | to immediately expire when the browser closes, set it to zero. | */ ''lifetime'' => 60*24*30, //doesn''t seem to work ?

Para que esto funcione en su servidor local, debe imitar una conexión https para asegurarse de que el inicio de sesión persiste. Puede hacerlo generando un certificado / clave ssl falso para su dominio local.

Hay varios tutoriales disponibles en línea que pueden ayudarlo a habilitar ssl.

Estos pueden ser útiles:

Cómo habilitar SSL en MAMP Pro

MAMP con SSL (https)

Cómo crear un certificado SSL en Apache para Ubuntu 12.04


El problema podría ser con la configuración de tu sesión. Comprueba si has configurado la tabla de sesiones. Laravel necesita usar el controlador de ''base de datos''.

Puede ver la configuración aquí: http://laravel.com/docs/session#database-sessions

¡Espero que esto ayude!


Estaba teniendo un problema similar, y al final estaba tan concentrado en el back-end que no consideraba que el problema pudiera estar en el front-end.

Utilicé blade para enviar Auth:logout() directamente a la interfaz para crear un botón de cierre de sesión, así:

<a href="{{Auth::logout()}}">Log out</a>

Que es incorrecto Cada vez que iniciaba sesión en la aplicación, me dirigían a una página con este botón, que erróneamente pensé que llamaría a Auth::logout() cuando se presionara. Por supuesto, el PHP se representa en la carga de la página y se llama a Auth::logout() inmediato. Luego, cuando un usuario navega a otra página, dado que se ha desconectado, se le redirige a la página de inicio de sesión para iniciar el proceso nuevamente.

FYI - La forma correcta de crear un botón de cierre de sesión, si está utilizando el controlador de ruta Auth predeterminado, sería dirigir a la ruta ''/ auth / logout'', así:

<a href="{{url(''/auth/logout'')}}">Log Out</a>


Intente pasar true a Auth: intento () para el parámetro remember :

if ( Auth::attempt(array(''email'' => $email, ''password'' => $password), true) ) { return Auth::user(); } else { return Response::make("Invalid login credentials, please try again.", 401); }

Sin embargo, no estoy seguro de por qué está devolviendo Auth :: user ().


Tratar de usar

ob_start(); ob_flush();

antes del retorno o la declaración del eco;

ex:

public function login() { PogfixHelper::$return[''ret''] = "error"; $iten = array( ''email'' => Input::get("Mail"), ''password'' => Input::get("Password"), ''flag_ativo'' => 1 ); if (Auth::attempt($iten)) { PogfixHelper::$return[''ret''] = "ok"; PogfixHelper::$return[''okMsg''] = "U are in"; PogfixHelper::$return[''redirect''] = URL::to(''panel/calendar''); } else { PogfixHelper::$return[''errorMsg''] = "Password not match"; } ob_start(); ob_flush(); echo json_encode(PogfixHelper::$return); }


Tuve este problema Cambiar la clave principal para el modelo de usuario me ayudó.

Intenta agregar algo como

protected $primaryKey = ''user_id'';

en clase Usuario {} (app / modelos / User.php)

(El campo user_id es la clave de incremento automático en mi esquema para la tabla de ''usuarios'')

Ver también este ticket: https://github.com/laravel/framework/issues/161


Tuve este problema hoy por la mañana y me di cuenta de que cuando sacabas datos antes de llamar

Auth::attempt($credentials);

Entonces puedes ASEGURARSE DE QUE TU SESIÓN NO SE FIJARÁ. Entonces, por ejemplo, si haces algo como

echo "This is the user " . $user;

justo por encima de la línea que dice

Auth::attempt($credentials);

Entonces puede estar seguro de que pasará toda la mañana tratando de encontrar por qué laravel no persiste el usuario autenticado y la llamada

Auth::user()

le dará un nulo, y también llamando

Auth::check()

siempre te dará falso.

Este era mi problema y así es como lo arreglé, al eliminar la declaración de eco.