web-dev-qa-db-ja.com

Laravel Auth:attempt()はログインを保持しません

同様の問題を抱えた多くのリソースをオンラインで見つけましたが、どの問題も私の問題を解決するようには見えません。

次のコードでユーザーをログインすると、すべてがうまくいくようです:

_$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);
}
_

Auth::attempt()関数はtrueを返し、ログインしたユーザーはAuth::user()を使用してクライアントに返されます。

ただし、クライアントがサーバーの直後に別の要求を行うと、Auth::user()NULLを返します。

Session::put()Session::get()を使用して、Laravelセッションが正常に機能していることを確認しました。

更新

さらに調査すると、セッションも持続していないようです!これは、app.mydomain.com経由でAngularJS Webアプリサーバーを使用し、api.mydomain.com経由で提供されるLaravel API?

私のユーザーモデルは次のとおりです。

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

}
_

私の認証設定は次のとおりです。

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

    ),

);
_

usersテーブルの作成に使用される移行は次のとおりです。

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

}
_

そして、セッション構成:

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

);
_

何か案は?

28
Leon Revill

この問題がありました。ユーザーモデルの主キーを変更すると、助けになりました。

のようなものを追加してみてください

protected $primaryKey = 'user_id';

クラスUser {}(app/models/User.php)

(フィールドuser_idは、「ユーザー」テーブルのスキーマの自動インクリメントキーです)

このチケットも参照してください: https://github.com/laravel/framework/issues/161

28
Juljan

今日の朝、この問題が発生しました。電話をかける前にデータを出力すると、

Auth::attempt($credentials);

その後、セッションが設定されないことを確認できます。たとえば、次のような場合

echo "This is the user " . $user;

言う行のすぐ上

Auth::attempt($credentials); 

その後、午前中はなぜlaravel=が認証されたユーザーを保持せず、

Auth::user()

あなたにnullを与え、また呼び出します

Auth::check() 

常に偽りを与えます。

これが私の問題であり、それがechoステートメントを削除することで修正した方法です。

12
Moses Ndeda

laravel 5.7。認証後にセッションが持続しない場合に同様の問題に直面した人は誰でも、以下のような解決策に従うことができます。

ファイルを開くApp\Http\kernel.php

移動\Illuminate\Session\Middleware\StartSession::class, from protected $middlewareGroupsからprotected $middleware。それでおしまい。

7
Nayeem Azad

trueパラメータのrememberをAuth:attempt()に渡してみてください:

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

しかし、なぜAuth :: user()を返すのかまったくわかりません。

4
TonyArra

私は同様の問題を抱えていましたが、最終的にはバックエンドに集中しすぎたため、フロントエンドに問題があるとは考えませんでした。

ブレードを使用してAuth:logout()をフロントエンドに直接出力し、次のようにログアウトボタンを作成しました。

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

それは間違っています。アプリケーションにログインするたびに、このボタンがオンになっているページにリダイレクトされ、押されたときにAuth::logout()を呼び出すと誤って考えていました。もちろん、PHPはページロードでレンダリングされ、Auth::logout()がすぐに呼び出されます。その後、ユーザーがログアウトしているため、別のページに移動するとログインページにリダイレクトされ、プロセスが再び開始されます。

参考-デフォルトの認証ルートコントローラを使用している場合、ログアウトボタンを作成する正しい方法は、次のようにルート「/ auth/logout」にリダイレクトすることです。

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

2
TimothyBuktu

まず、Laravel 5.8。

少なくとも私の場合、@ nayeem-azadの解決策が良い解決策であることを確認します。 App\Http\kernel.phpの1つの違いは、この行を移動しません:

\Illuminate\Session\Middleware\StartSession::class

from protected $ middlewareGroups to protected $ middlewareしかし、それをprotected $ middlewareにのみコピーしました。

それが役に立てば幸い ;-)

0
f-red

使用してみてください

ob_start();
ob_flush(); 

returnまたはechoステートメントの前。

ez:

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

Laravel 5.7を使用します。

同じ問題がありましたが、ログインにユーザー名を使用しようとしていたためです。デフォルトのemailname、およびpasswordそしてemailを介してログインしたくない場合は、vendor/laravel/framework/src/Illuminate/Foundation/Auth/に移動してAuthenticatesUsers.phpファイルを開きます。その中にusernameというパブリック関数があります:

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

ご覧のとおり、デフォルトでは'email'に設定されています。次に、これをユーザーがパスワードと組み合わせてログインするときに使用するものに変更できます。そのため、私のWebサイトでは、ユーザーがusernameを使用してログインすることを望んでいました。したがって、単に'email'から'username'に変更します。

これが誰かの助けになることを願っています。

注:奇妙なことに、何らかの理由で、usernameおよびpasswordを使用してログインしようとしてもエラーは発生しませんでした。代わりに、それは一見検証されますが、ユーザーを永続化しないだけで、理由はわかりません。

0

セッションテーブルのidフィールドはどのくらいですか? LaravelはセッションIDとしてsha1ハッシュを使用します。これにより、長さ40の文字列が生成されます。同様の問題が発生しました。idフィールドの長さが32に設定されたためです。

この質問を参照してください: Laravel 4.1認証セッションデータがリクエスト間で保持されない

0
ralbatross

深く掘り下げたわけではありませんが、laravelは安全な接続を介してのみCookieを返します。

お気づきのように、laravelはcookieを設定していますが、セッションのlifetime設定に応答していません.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 ?

これをローカルサーバーで機能させるには、https接続を模倣して、ログインが持続することを確認する必要があります。これを行うには、ローカルドメインの偽のSSL証明書/キーを生成します。

SSLを有効にするのに役立ついくつかのチュートリアルがオンラインで利用できます。

これらは役に立つかもしれません:

MAMP ProでSSLを有効にする方法

MAMP with SSL(https)

buntu 12.04用のApacheでSSL証明書を作成する方法

0
Varun Nath

問題はセッション構成にある可能性があります。セッションテーブルを設定したかどうかを確認しますLaravelは「データベース」ドライバーを使用する必要があります。

ここで設定を確認できます: http://laravel.com/docs/session#database-sessions

お役に立てれば!

0
Bill Riley