登录时令牌不匹配异常(Laravel)

时间:2014-02-27 10:50:04

标签: laravel

我遵循了使用Laravel创建注册和登录页面的this教程。

一切顺利,唯一的问题是我无法登录。如果我提供了错误的用户名/密码,它会正确地给我一个错误消息。但如果我使用正确的凭据,我会收到以下错误 -

Illuminate \ Session \ TokenMismatchException

这是我的(默认)csrf函数 -

Route::filter('csrf', function()
{
    if (Session::token() != Input::get('_token'))
    {
        throw new Illuminate\Session\TokenMismatchException;
    }
});

这是表单操作 -

{{ Form::open(array('url'=>'signin', 'class'=>'form-signin')) }}

这是我的UsersController的相关部分

public function __construct() {
$this->beforeFilter('csrf', array('on'=>'post'));
$this->beforeFilter('auth', array('only'=>array('getDashboard')));

}
public function postSignin() {
       if (Auth::attempt(array('email'=>Input::get('email'), 'password'=>Input::get('password')))) {
            return Redirect::to('dashboard')->with('message', 'You are now logged in!');
        } else {
            return Redirect::to('login')
            ->with('message', 'Your username/password combination was incorrect')
            ->withInput();
    }  
}

public function getDashboard() {
    $this->layout->content = View::make('users.dashboard');
}

5 个答案:

答案 0 :(得分:3)

Laravel对会话进行了相当深奥的使用,当存储在数据库中的用户cookie和用户salt由于某种原因(例如,当您重新设置用户表时)时,会出现令牌不匹配异常没有进一步解释。

如果是这种情况,请删除您的Cookie。

答案 1 :(得分:1)

我在登录时遇到了这个问题。这个异常不时发生,所以我停下来试图重现它。这样做我成功了:

首先我加载登录页面。

然后我删除了cookie。

然后,在没有重新加载登录页面的情况下,我输入了用户名和密码并尝试登录。

因为会话被删除了(当我删除cookie时),这段代码不会通过是正常的,它会抛出TokenMismatchException。

Route::filter('csrf', function() {
    if ( Session::getToken() != Input::get('_token')) {
        throw new Illuminate\Session\TokenMismatchException;
    }
});

所以,我为解决我的问题所做的是添加一个重定向到登录页面,并带有一条消息通知用户该会话可能已过期。

Route::filter('csrf', function() {
    if ( Session::getToken() != Input::get('_token')) {
        return Redirect::to('/admin/login')->with('warning', 'Your session has expired. Please try logging in again.');
    }
});

因此,在页面重新加载后,会创建一个新会话并解决问题。

答案 2 :(得分:1)

检查您的路由:列表以查看Login是否受Web中间件保护。在我的情况下,我错误地将web middileware添加到登录路由,它应该是访客中间件。

答案 3 :(得分:0)

我遇到了这个问题,原因是没有可用的磁盘空间。

获取一些空间并尝试重新登录。

答案 4 :(得分:0)

我将以下代码添加到app\Exceptions\Handler.php中,以帮助澄清最终用户的错误,除了将会话设置为在关闭时到期,如该线程中所述。

    protected function prepareException(Exception $exception)
    {
        if ($exception instanceof TokenMismatchException) {
            return new HttpException(
                419,
                "{$exception->getMessage()}. Please clear your browser cookies and try again.",
                $exception
            );
        }

        return parent::prepareException($exception);
    }