web-dev-qa-db-fra.com

Laravel Auth: tentative () ne persistera pas la connexion

J'ai trouvé de nombreuses ressources en ligne avec des problèmes similaires, mais aucune des solutions ne semble résoudre mon problème.

Lorsque je connecte un utilisateur avec le code suivant, tout semble correct:

$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 fonction Auth::attempt() renvoie true et l'utilisateur connecté est renvoyé au client à l'aide de Auth::user().

Mais si le client fait une autre demande au serveur directement après, Auth::user() renvoie NULL.

J'ai confirmé que les sessions Laravel fonctionnent correctement en utilisant avec succès les fonctions Session::put() et Session::get().

Mise à jour

Après enquête, il semble que les sessions ne persistent pas non plus! Cela pourrait-il être lié au fait d'avoir le serveur d'applications Web AngularJS via app.mydomain.com et l'API Laravel servie via api.mydomain.com?

Mon modèle d'utilisateur est le suivant:

<?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;
    }

}

Ma configuration d'authentification est la suivante:

<?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 migration utilisée pour créer la table users est la suivante:

<?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)
        {
            //
        });
    }

}

Et la configuration de la session:

<?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,

);

Des idées?

28
Leon Revill

J'ai eu ce problème. La modification de la clé primaire du modèle utilisateur m'a aidé.

Essayez d'ajouter quelque chose comme

protected $primaryKey = 'user_id';

dans la classe User {} (app/models/User.php)

(Champ user_id est la clé d'incrémentation automatique dans mon schéma pour la table "utilisateurs")

Voir aussi ce ticket: https://github.com/laravel/framework/issues/161

28
Juljan

J'ai eu ce problème aujourd'hui matin, et je me suis rendu compte que lorsque vous sortez des données avant d'appeler

Auth::attempt($credentials);

Ensuite, vous pouvez être sûr que votre session ne sera pas définie. Ainsi, par exemple, si vous faites quelque chose comme

echo "This is the user " . $user;

juste au-dessus de la ligne qui dit

Auth::attempt($credentials); 

Soyez assuré que vous passerez toute la matinée à essayer de comprendre pourquoi laravel ne persiste pas l'utilisateur authentifié et appelle

Auth::user()

vous donnera une valeur nulle et vous appellera également

Auth::check() 

vous donnera toujours faux.

C'était mon problème et c'est ainsi que je l'ai résolu, en supprimant l'instruction echo.

12
Moses Ndeda

J'ai eu le même problème dans laravel 5.7. Celui qui fait face à des problèmes similaires si la session ne persiste pas après l'authentification, peut suivre la solution comme ci-dessous ..

Fichier ouvert App\Http\kernel.php

Bouge toi \Illuminate\Session\Middleware\StartSession::class, de protected $middlewareGroups à protected $middleware. C'est ça.

7
Nayeem Azad

Essayez de passer true à Auth: tentative () pour le paramètre remember:

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

Je ne sais pas pourquoi vous retournez du tout Auth :: user ().

4
TonyArra

J'avais un problème similaire, et à la fin j'étais tellement concentré sur le back-end que je ne pensais pas que le problème pouvait être sur le front-end.

J'avais utilisé blade pour sortir Auth:logout() directement vers l'extrémité avant pour créer un bouton de déconnexion, comme ceci:

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

Ce qui est incorrect. Chaque fois que je me connectais à l'application, je serais redirigé vers une page avec ce bouton activé, que je pensais à tort appeler Auth::logout() lorsque pressé. Bien sûr, le PHP est rendu sur pageload et Auth::logout() est appelé immédiatement. Ensuite, quand un utilisateur navigue sur une autre page, depuis qu'il est déconnecté, il redirigé vers la page de connexion pour recommencer le processus.

FYI - La bonne façon de créer un bouton de déconnexion, si vous utilisez le contrôleur de route Auth par défaut serait de diriger vers la route '/ auth/logout', comme ceci:

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

2
TimothyBuktu

Premièrement, j'ai le même problème sur Laravel 5.8.

Je confirme que la solution de @ nayeem-azad est la bonne, du moins dans mon cas. Une différence, dans App\Http\kernel.php, je ne déplace pas cette ligne:

\Illuminate\Session\Middleware\StartSession::class

de protégé $ middlewareGroups à protégé $ middleware mais seulement copié dans middleware protégé $ .

J'espère que cela aide ;-)

0
f-red

Essayez d'utiliser

ob_start();
ob_flush(); 

avant le retour ou la déclaration d'écho;

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);
    }
0
Jean Dobler

En utilisant Laravel 5.7 d'ailleurs).

J'ai eu le même problème mais c'était parce que j'essayais d'utiliser leur nom d'utilisateur pour se connecter. Dans le cas où vous avez des données utilisateur personnalisées en plus des valeurs par défaut email, name et password et vous ne voulez pas qu'ils se connectent via leur email alors vous allez à vendor/laravel/framework/src/Illuminate/Foundation/Auth/ et ouvrez le AuthenticatesUsers.php fichier. Il contient une fonction publique appelée username:

     /**
     * Get the login username to be used by the controller.
     *
     * @return string
     */
    public function username()
    {
        return 'email'; // <----
    }

Comme vous pouvez le voir, par défaut, il est défini sur 'email'. Vous pouvez ensuite changer cela avec ce que vous voulez que l'utilisateur se connecte avec son mot de passe. Donc, pour mon site Web, je voulais que l'utilisateur se connecte en utilisant son username. Il vous suffit donc de le changer de 'email' à 'username'.

J'espère que ça aidera quelqu'un.

REMARQUE: De façon assez particulière, pour une raison quelconque, cela ne m'a donné aucune erreur lorsque j'ai essayé de me connecter en utilisant username et password. Au lieu de cela, cela validerait apparemment mais ne persisterait pas l'utilisateur et je n'ai aucune idée pourquoi.

0
Edward Severinsen

Quelle est la longueur du champ id dans votre table de sessions? Laravel utilise un hachage sha1 comme identifiant de session, ce qui donne une chaîne de longueur 40. J'ai eu un problème similaire et c'est parce que mon champ id a été défini sur la longueur 32.

Voir cette question: les données de session d'authentification Laravel 4.1 ne persistent pas entre les demandes

0
ralbatross

D'accord, je n'ai pas creusé profondément, mais j'ai pensé que laravel ne renvoie que les cookies via une connexion sécurisée.

Comme vous avez dû le remarquer, laravel installe un cookie mais ne répond pas au paramètre de durée de vie 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 ?

Pour que cela fonctionne sur votre serveur local, vous devez imiter une connexion https pour vous assurer que la connexion persiste. Vous pouvez le faire en générant un faux certificat/clé SSL pour votre domaine local.

Il existe plusieurs didacticiels disponibles en ligne qui peuvent vous aider à activer SSL.

Ceux-ci pourraient être utiles:

Comment activer SSL dans MAMP Pro

MAMP avec SSL (https)

Comment créer un certificat SSL sur Apache pour Ubuntu 12.04

0
Varun Nath

Le problème peut être lié à la configuration de votre session. Vérifiez si vous avez configuré la table de session Laravel doit utiliser le pilote 'database'.

Vous pouvez voir la configuration ici: http://laravel.com/docs/session#database-sessions

J'espère que cela t'aides!

0
Bill Riley