请求的令牌和会话令牌不相同

时间:2016-06-04 12:44:12

标签: php laravel authentication laravel-5.2 csrf

首先,抱歉我的英文不好

我已通过此命令创建了一个新项目:

laravel new blog

然后,我在博客项目中运行了make:auth

然后我尝试使用以下地址登录博客:

本地主机:8000 /登录

一切正常,我可以毫无问题地登录博客!

我还创建了用户表并添加了一些用户!

问题:

当我在主机上部署这个非常简单的项目时,问题就开始了。当这个项目部署在主机上并尝试登录时,它会让我:

TokenMismatchException in VerifyCsrfToken.php line 67:

这很奇怪,因为它适用于localhost,但不适用于Host!

到目前为止我尝试了什么:

我试图找出用户请求Token与会话中的令牌进行比较的位置。我发现在以下文件中有一个名为tokensMatch的方法:

/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php

我修改了这个方法:

protected function tokensMatch($request)
    {
        $sessionToken = $request->session()->token();

        $token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');
        $myArray = [        // I added this line
            'SessionToken' => $sessionToken,
            'RequetedToken' => $token,
        ];
        var_dump($myArray); // I added this line
        die();              // I added this line
        if (! $token && $header = $request->header('X-XSRF-TOKEN')) {
            $token = $this->encrypter->decrypt($header);
        }

        if (! is_string($sessionToken) || ! is_string($token)) {
            return false;
        }

        return hash_equals($sessionToken, $token);
    }

所以,然后我尝试登录localhost,输出是这样的:

Array
(
    [sessionToken] => YhfaZMkbEPwWdYmT4D1kyZeysEhFnltROvMgvRQh
    [RequestedToken] => YhfaZMkbEPwWdYmT4D1kyZeysEhFnltROvMgvRQh
)

它显示请求的令牌和会话令牌相等,我可以成功登录。

然后我尝试登录主机,输出是这样的:

Array
(
    [sessionToken] => GSXeJSwD1mVSQ5XwgbLjnIk3VfhT5GzsiijfE15e
    [RequestedToken] => Nd540vhx5BDidQb2FwudHWRzkK65IIhjgEBcf9ur
)

正如您所看到的,请求的令牌和会话令牌是不同的!所以我无法登录它,这让我感到非常可怕TokenMismatchException错误!

对我来说没有意义!我不明白为什么!

任何帮助都会非常感激

更新:

这是我的auth/login.blade.php文件内容:

@extends('layouts.app')
    @section('content')
    <div class="container">
        <div class="row">
            <div class="col-md-8 col-md-offset-2">
                <div class="panel panel-default">
                    <div class="panel-heading">Login</div>
                    <div class="panel-body">
                        <form class="form-horizontal" role="form" method="POST" action="{{ url('/login') }}">
                            {{ csrf_field() }}

                            <div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}">
                                <label class="col-md-4 control-label">E-Mail Address</label>

                                <div class="col-md-6">
                                    <input type="email" class="form-control" name="email" value="{{ old('email') }}">

                                    @if ($errors->has('email'))
                                        <span class="help-block">
                                            <strong>{{ $errors->first('email') }}</strong>
                                        </span>
                                    @endif
                                </div>
                            </div>

                            <div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}">
                                <label class="col-md-4 control-label">Password</label>

                                <div class="col-md-6">
                                    <input type="password" class="form-control" name="password">

                                    @if ($errors->has('password'))
                                        <span class="help-block">
                                            <strong>{{ $errors->first('password') }}</strong>
                                        </span>
                                    @endif
                                </div>
                            </div>

                            <div class="form-group">
                                <div class="col-md-6 col-md-offset-4">
                                    <div class="checkbox">
                                        <label>
                                            <input type="checkbox" name="remember"> Remember Me
                                        </label>
                                    </div>
                                </div>
                            </div>

                            <div class="form-group">
                                <div class="col-md-6 col-md-offset-4">
                                    <button type="submit" class="btn btn-primary">
                                        <i class="fa fa-btn fa-sign-in"></i>Login
                                    </button>

                                    <a class="btn btn-link" href="{{ url('/password/reset') }}">Forgot Your Password?</a>
                                </div>
                            </div>
                        </form>
                    </div>
                </div>
            </div>
        </div>
    </div>
    @endsection

1 个答案:

答案 0 :(得分:0)

这很可能是因为您没有以正确的方式打开表单(请分享HTML),导致不发送令牌。

使用Laravel Form

{!! Form::open(array('url' => 'foo/bar')) !!}
//
{!! Form::close() !!}
  

将CSRF令牌添加到表单Laravel提供了一种简单的方法   保护您的应用程序免受跨站点请求伪造。第一,   随机令牌放在用户的会话中。如果你使用   使用POST,PUT或DELETE CSRF令牌的Form :: open方法将是   自动添加到您的表单作为隐藏字段。或者,如果   您希望为隐藏的CSRF字段生成HTML,您可以使用   令牌方法:

     

echo Form :: token();