web-dev-qa-db-ja.com

VerifyCsrfToken.phpの53行目のTokenMismatchException Laravel 5.1

ログインしようとすると、トークンエラーが表示されます。トークンをビュー形式で確認しましたが、コメント\App\Http\Middleware\VerifyCsrfToken::classの場合、Kernel.phpでログインできますが、ダッシュボードにリダイレクトした後、ログインできません。MacでMAMPを使用しています。

<div>
    <h1>Login</h1>
    <div>
        {!! Form::open(['url'=>'user/login','class' => '']) !!}
        <input type="hidden" name="_token" value="{{ csrf_token() }}">
        <ul>
          <li><label>Customer Code</label>{!!Form::Text('customer_code',Input::old('customer_code'),['class'=>''])!!}</li>
          <li><label>Password</label>{!!Form::Password('password','',['class'=>''])!!}</li>
          <li>{!! Form::submit('Submit',array('class' => 'btn')) !!}</li>
        </ul> 
        {!!Form::close()!!}
    </div>
    <div><a href="{!!URL::to('user/forget_password')!!}">Forget Password</a></div>
</div>

その間、ログインにはSentry Packageを使用します。

    /**
     * post_login
     */
    public function post_login()
    { 
        try
        {
            $rules  = [ 
                    'customer_code'         => 'required',
                    'password'              => 'required',
                ] ;                    
            $message = [ 
                    'customer_code.required'             => 'erorrr1',
                    'password.required'                =>'error2'    
                             ];                            
            $validator = Validator::make(Input::all(), $rules,$message);
            if ($validator->fails())
            {            
                return Redirect::back()->withErrors($validator)->withInput();        
            } // if ($validator->fails())
            else
            {
            $authUser = Sentry::authenticateAndRemember(array(
                                      'customer_code'    => Input::get('customer_code'),
                                      'password' => Input::get('password')), false);

                           if($authUser) 
                           {
                                //$login = Sentry::loginAndRemember($authUser);
                                 return Redirect::to('user/panel/'.$authUser->id)->with('comment', 'Welcome');
                           }
                           else
                           {
                             return Redirect::back()->with('comment', 'Error for login');
                           }
            }//validator                           
        }
         catch(\Exception $e)
         {
             return Redirect::back()->withInput(Input::except('password','file'))->withErrors(['ERROR!!!!!']);
         }
}
9
reza_khalafi

編集:

Form Builderを使用しているので、これをフォームから削除してください。 Laravelフォームビルダーは、非表示のトークンフィールドをフォームに自動的に追加しますForm::open()

したがって、この行を削除します。

 <input type="hidden" name="_token" value="{{ csrf_token() }}">
5
Emeka Mbah

さて、ログアウト中にすべてがCSRFトークンの作成に失敗したと思います!

私が問題を解決したので。

以下のコードをヘッダーに追加してください。

_<meta name="csrf-token" content="{{ csrf_token() }}">
<script type=text/javascript>
    $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
    });
 </script>
_

そして、{!!Form::open()!!}を使用すると、自動的にトークンが作成されます。それ以外の場合は使用できます

_<input type="hidden" name="_token" id="_token" value="{!! $csrf_token !!}}" />
_

または

_{!! csrf_field() !!}
_

ただちに開いた形。最も重要なのは、トークンを作成できるコントローラー関数またはページのリロードまたはajaxのリロードでreturn Redirect::to('');を使用することです!

お気に入り:

_public function logout() {
    Session::flush();
    Auth::logout();

    return Redirect::to('/');
}
_

トークンが適切に作成されていることを確認するには、ブラウザで「ページのソースを表示」をチェックすると、次のように表示されます

_<meta name="csrf-token" content="TbgWTQZhTv0J4eFBQNU4rlM3jOlmBeYlTgf0waZB">
    <script type=text/javascript>
    $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
    });
    </script>


<form method="POST" action="/login-process" accept-charset="UTF-8" class="form-inline"><input name="_token" type="hidden" value="TbgWTQZhTv0J4eFBQNU4rlM3jOlmBeYlTgf0waZB">   
_

それが私のために働いたので、それは問題を解決するかもしれないと思います!

2
Honest Knight

Laravel 5.1のフレッシュインストールでは、composerバージョン5.0から5.1への更新を行わずに、いくつかの違いとMiddlewareフォルダーに1つ違いがあります。

EncryptCookies.phpは新しいミドルウェアです。お持ちかどうかを確認してください。

だから、私は再びテストしていません、私は自分のファイルをバージョン5.0からバージョン5.1の新しいインストールに転送しますが、それがこの問題の解決策であると確信しています、EncryptCookies.phpはスタックのスタックにありましたトークンの不一致エラー。

1
Gabriel Sigouin

{!! csrf_field() !!}を追加すると、以下のように問題が解決しました:

<form action="#" method="post" class="form-horizontal" role="form">
{!! csrf_field() !!}

</form>

Laravel以下のようなフォームヘルパーを使用する場合:

{!! Form::open(array('class' => 'form-horizontal', 'role' => 'form')) !!}

CSRFコードがHTMLスクリプトに自動的に追加されます。また、ブラウザでソースコードを表示して、以下のようなフィールドが実際に追加されていることを確認してください。

<input type="hidden" name="_token" value="dHWBudjTyha9AMr0SuV2ABq5NNK6bTIDZDXRWCBA">
1
Fokwa Best

フォームの横に<?php echo Form::token(); ?>を追加します。

0
IshaS

ファイルをアップロードしようとしたときにも、この問題が発生していました。 max_post_sizeを超えていることが判明しました。その場合、明らかにすべてのPOST変数がクリアされているため、トークンが受信されていません。

0
Dennis Koster

私も同じ問題を抱えていました。私はLaravel 5.1.28、php 5.6.13を使用しています
VerifyCsrfTokenでTokenMismatchExceptionを確認した後、Webで回答を検索しましたが、問題は解決しませんでした。

ページはトークンを送信しました。トークンの値は、ディレクトリstorage/framework/sessionsのセッションファイルにも表示されます(暗号化を無効にして表示しています)。

疲れたので、laravelを再インストールし、テストにシンプルなフォームを使用しました-トークンの不一致エラーなしで動作しました。

私のコードを新しくインストールしたlaravel個ずつ)に移動すると、問題がdoctrine/dbalによって引き起こされていることがわかりました(まだ理由はわかりません)。

Composer.jsonから削除すると、問題はなくなりました。
composer.jsonでは、次の行でトークンの不一致エラーが発生しました。

"require": {
    ....
    "doctrine/dbal": "^2.5"
    ...
},

ケースは異なる場合がありますが、問題の原因となっている可能性のあるcomposer.jsonの変更を確認したい場合があります。

0
Brian Ye

このコードを使用しているときに同じ問題があります

_<input type="hidden" name="_token" value="{!! csrf_token() !!}">

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

それを{!! csrf_field() !!}に変更することで私の問題を解決します

私はL5.1を使っています

0
majid

この解決策は私にとってうまくいきました:

フォームの任意の場所に{{ csrf_field() }}を追加します。

0
Mario Ene

Kernel.phpの$ middlewareからApp\Http\Middleware\VerifyCsrfToken :: classを削除します。

0
user1236395

質問にサンプルコードを投稿していません。

したがって、次のオプションでコードを確認してください。

非表示の入力フィールド値で試してください:

{!! csrf_token() !!} or {{ csrf_token() }}

フォームブレードテンプレートを使用することもできます。

{!! Form::open(array('method' => 'GET/POST','url' => 'YOUR_URL',)) !!}

これにより、HTMLスクリプトにCSRFコードが自動的に追加されます

<head>セクションに含めるもう1つのことは次のとおりです。

<meta name="csrf-token" content="{{ csrf_token() }}">
0
Siddharth Jogia

わたしにはできる。

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

<script>
function getMessage(){ 
$.ajax({
   headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},
   type:'POST',
   url:'/getmsg',
   // data:'_token = <?php echo csrf_token() ?>',
   success:function(data){
      $("#msg").html(data.msg);
   }
 });
}
</script>

{{ Form::button('Replace Message',['onClick'=>'getMessage()']) }}
0
Mamun Rasid

次のコードを使用しました。それは完全に働いています。

<?php echo csrf_token(); ?>
0
user3378755