【问题标题】:The requested Token and the session Token are not same请求的 Token 和会话 Token 不相同
【发布时间】:2016-10-04 11:09:42
【问题描述】:

首先,对不起我的英语不好

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

laravel new blog

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

然后我尝试使用这个地址登录博客:

localhost:8000/登录

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

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

问题:

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

TokenMismatchException in VerifyCsrfToken.php line 67:

这很奇怪,因为它可以在 localhost 上运行,但不能在 Host 上运行!

到目前为止我所做的尝试:

我试图找出用户请求的令牌与会话中的令牌相比在哪里。我发现在以下文件中有一个名为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);
    }

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

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

说明请求的Token和会话的Token相等,可以登录成功。

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

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

【问题讨论】:

    标签: php laravel authentication laravel-5.2 csrf


    【解决方案1】:

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

    使用Laravel Form

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

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

    回显形式::token();

    【讨论】:

    • 正如我在问题中提到的,我使用的是 Laravel 的默认身份验证系统。你的意思是 Laravel 以错误的方式使用 Form 吗? (我不这么认为!)。无论如何,我尝试了您的方法,但得到了同样的错误!没有任何改变!
    • @user41888 你能分享你的html吗?我说的是不在帖子上发送 csrf 令牌。
    • @user41888 您是否遵循这些准则? laravelcollective.com/docs/5.2/html
    • 当我尝试按照您的建议使用 Form 外观时,是的,我确实遵循了该指导方针
    • @user41888 您是否有机会尝试从其他域发布到表单?
    猜你喜欢
    • 2021-09-19
    • 2015-02-18
    • 2018-06-04
    • 2017-09-24
    • 1970-01-01
    • 2020-07-11
    • 2017-08-25
    • 1970-01-01
    • 2018-01-18
    相关资源
    最近更新 更多