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

3
我遵循了使用Laravel创建注册和登录页面的这个教程。
一切都运行得很顺畅,唯一的问题是我无法登录。如果我提供错误的用户名/密码,它会正确地给出错误消息。但是,如果我使用正确的凭据,我会收到以下错误 -
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');
}

尝试在CSRF过滤器中使用dd(Session::token();dd(Input::get('_token')来检查缺少令牌的部分。 - Andreyco
问题随机地自行解决了... O.o - Sainath Krishnan
你在表单中添加了这行代码吗? <input type="hidden" name="_token" value="{{ csrf_token() }}" /> - captainblack
6个回答

4

Laravel使用sessions时有些高深莫测,当用户cookie和用户salt在数据库中存在不对齐的情况时(例如,当您重新生成用户表时),会出现Token Mismatch Exception异常,但没有进一步的解释。

如果出现这种情况,请删除您的cookies。


1
我在登录时也遇到了这个问题。这个异常偶尔会发生,所以我停下来试图复现它。我通过以下步骤成功地复现了它:
首先,我加载了登录页面。
然后我删除了cookies。
然后,在没有重新加载登录页面的情况下,我输入了用户名和密码并尝试登录。
因为会话已被删除(当我删除cookies时),所以这段代码不会正常运行,它会抛出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.');
    }
});

因此,页面重新加载后,将创建一个新的会话,问题得到解决。

你是指在我的 web.php 中添加 Route::filter 吗?我使用的是 laravel 5.4 - Yousef Altaf

1

检查你的路由列表,看看登录是否受Web中间件保护。在我的情况下,我犯了一个错误,将Web中间件添加到登录路由上,而应该是访客中间件。


1

/config/session.php设置 'expire_on_close' => true,保存并重新加载您的网站,您将不再遇到登录时的令牌不匹配异常问题。


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

0

我曾经遇到过这个问题,它是由于磁盘空间不足引起的。

腾出一些空间,然后再尝试登录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接