带有ajax登录的Laravel 5.0 TokenMismatchException

Posted

技术标签:

【中文标题】带有ajax登录的Laravel 5.0 TokenMismatchException【英文标题】:Laravel 5.0 TokenMismatchException with ajax login 【发布时间】:2015-11-02 01:08:11 【问题描述】:

我正在 debian 7 服务器上使用 laravel 5.0、php 5.5 开发 Web 应用程序。

本网站允许用户通过登录模式(ajax 登录)登录。但是……

我不断收到此异常

TokenMismatchException in VerifyCsrfToken.php line 47

我知道关于 csrf_token() 的故事必须以表单和 X-CSRF-TOKEN 用于 ajax 发布。我已经尝试了所有方法,但仍然没有解决方案。

有趣的是,只有在您第一次访问该网站时才会发生这种情况,在主页或任何页面上直接访问。当您访问会员区时,laravel 会将您重定向到 auth 错误的主页,之后您将永远不会再收到 tokenmismatchexception,相同的登录模式就像阳光一样工作。

任何建议

更新:

代码如下:

在我已经包含 csrf_code() 的标题中:

<meta name="csrf-token" content=" csrf_token() ">

并在表单中(实际上是可选的,因为 X-CSRF-TOKEN 已经设置好了)

<input type="hidden" name="_token" value=" csrf_token() ">

路线:

Route::post('/login', ['as' => 'auth.login', 'uses' => 'Auth\AuthController@postSignin']);

VerifyCsrfToken.php 进行调试。

public function handle($request, Closure $next)

    if ($this->isReading($request) || $this->tokensMatch($request)) 
        return $this->addCookieToResponse($request, $next($request));
    

    throw new TokenMismatchException;


public function tokensMatch($request)

    $token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');

    if (!$token && $header = $request->header('X-XSRF-TOKEN')) 
        $token = $this->encrypter->decrypt($header);
    
    \Clockwork::info($request->session()->token());
    //\Clockwork::info(\Session::token());
    \Clockwork::info($token);
    //return StringUtils::equals($request->session()->token(), $token);
    return StringUtils::equals(\Session::token(), $token);

Jquery Ajax 设置:

$.ajaxSetup(
    headers: 
        'X-XSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    
);

输出:

【问题讨论】:

"I have tried every thing"。你试过什么? 覆盖句柄和tokensMatch方法,将$request->session()->token()更改为Session::token(),也在元标记中将csrf_token()替换为Session::token( ),但发布时仍然没有相同的令牌。 您是否将令牌添加到您的 ajax HTTP 发布请求中? 是的,通过日志我可以看到 $request->session()->token() 与同样由 laravel self 生成的 ajax 令牌不同。 好吧,看来您已经尝试了解决此问题的常用方法。如果没有看到任何代码,真的很难帮助你。我可以整天坐在这里问你问题,直到我们缩小范围,但是发布你的代码可以节省我们俩的时间。 【参考方案1】:

是的,终于修好了,原因是网站开头有两个空行。在我使用过的内容刀片中

@extends('layouts/main')...@show

用于显示布局。 @show 导致两个空行,删除 @show 并且空行消失了。无论出于何种原因,这会破坏网站上的所有 cookie,并且 Laravel 无法创建会话。

【讨论】:

【参考方案2】:

您的所有代码都运行良好..

你可以试试这个...

$.ajaxSetup(
headers: 
    'X-XSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')

);

在调用 jquery 文件后移动这段代码...

实际上,当页面加载时,运行此代码后加载 html dom。你应该这样做,你的这段代码应该在加载 html dom 之后运行。

我的网站也遇到了同样的问题。

【讨论】:

以上是关于带有ajax登录的Laravel 5.0 TokenMismatchException的主要内容,如果未能解决你的问题,请参考以下文章

Laravel中的令牌不匹配ajax

Laravel 5.0 - 登录失败时更改重定向

Laravel 5.0 显示登录客人和注册用户

Laravel 5.0 扩展了“注销”功能

laravel 中删除多条记录

Laravel通过ajax登录维护会话