web-dev-qa-db-fra.com

TokenMismatchException dans ligne VerifyCsrfToken.php 53 dans Laravel 5.1

Lorsque j'essaie de me connecter, affichez-moi une erreur de jeton. J'ai vérifié le jeton dans la forme d'affichage, il a raison et lorsque le commentaire \App\Http\Middleware\VerifyCsrfToken::class, Dans le Kernel.php me permet de me connecter, mais après la redirection vers mon tableau de bord, je ne suis pas connecté. J'utilise MAMP sur mac.

<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>

En attendant, j'utilise Sentry Package pour me connecter.

    /**
     * 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

Édité:

Puisque vous utilisez le générateur Formulaire, supprimez-le de votre formulaire. Le générateur de formulaire Laravel ajoute automatiquement un champ de jeton masqué à votre formulaire lorsque vous exécutez Form::open().

Alors supprimez cette ligne:

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

Eh bien, je pense que tous ont raté la création du jeton CSRF lors de la déconnexion!

Comme j'ai résolu le problème.

Ajoutez simplement le code ci-dessous à l'en-tête.

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

Et si vous utilisez {!!Form::open()!!}, le jeton sera automatiquement créé. Sinon, vous pouvez utiliser 

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

ou

{!! csrf_field() !!}

juste forme immédiate ouverte. Plus important encore, utilisez return Redirect::to(''); sur la fonction du contrôleur ou un rechargement de page ou un rechargement ajax que le jeton puisse être créé!

Comme:

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

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

Pour vous assurer que le jeton a été créé correctement ou non, cochez "Afficher la source de la page" dans le navigateur.

<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">   

Je pense que cela pourrait résoudre le problème car cela a fonctionné pour moi!

2
Honest Knight

Avec une nouvelle installation de Laravel 5.1, sans une simple mise à jour du compositeur de la version 5.0 à la version 5.1, je vois quelques différences et une dans le dossier Middleware. 

EncryptCookies.php est un nouveau middleware, vérifiez si vous l'avez. 

Donc, je n'ai pas encore testé, j'ai transféré au moment mes fichiers de ma version 5.0 à une nouvelle installation de la version 5.1 mais je suis sûr que ça peut être la solution à ce problème, EncryptCookies.php était dans la pile du erreur d'incompatibilité de jeton. 

1
Gabriel Sigouin

Ajouter {!! csrf_field() !!} a résolu mon problème comme indiqué ci-dessous:

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

</form>

Si vous utilisez Laravel, un assistant tel que ci-dessous:

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

Le code CSRF sera ajouté automatiquement dans votre script HTML. Veillez également à afficher le code source dans le navigateur pour vous assurer qu'un champ tel que ci-dessous a bien été ajouté.

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

Ajoutez <?php echo Form::token(); ?> à côté du formulaire.

0
IshaS

J'avais aussi ce problème en essayant de télécharger un fichier. Si max_post_size était dépassé, toutes les variables POST sont apparemment effacées et aucun jeton n'est donc reçu.

0
Dennis Koster

J'ai eu le même problème. J'utilise Laravel 5.1.28, php 5.6.13
Après avoir vu l’exception TokenMismatchException dans VerifyCsrfToken, j’ai cherché sur le Web des réponses, mais aucune n’a résolu mon problème.

La page a envoyé le jeton. Les valeurs de jeton sont également visibles dans le fichier de session dans le répertoire storage/framework/sessions (j’ai désactivé le chiffrement pour le voir).

Épuisé, je réinstalle laravel et utilise un formulaire simple pour les tests - cela fonctionne sans erreur de correspondance des jetons.

En déplaçant mon code pièce par pièce vers le laravel nouvellement installé, j’ai finalement trouvé Que le problème était causé par doctrine/dbal (je ne sais toujours pas pourquoi).

Supprimez-le de composer.json et le problème a disparu.
Dans composer.json, une erreur de concordance de jeton a été constatée avec la ligne suivante:

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

Votre cas peut être différent, mais vous voudrez peut-être savoir si vous modifiez quoi que ce soit dans Composer.json qui pourrait être à l'origine du problème.

0
Brian Ye

J'ai le même problème en utilisant ce code 

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

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

en le changeant en {!! csrf_field() !!} résoudre mon problème 

je suis sur L5.1

0
majid

Cette solution a fonctionné pour moi:

Ajoutez {{ csrf_field() }} n'importe où dans le formulaire.

0
Mario Ene

Supprimez App\Http\Middleware\VerifyCsrfToken :: class de $ middleware dans Kernel.php.

0
user1236395

Vous n'avez pas posté votre exemple de code dans votre question.

Par conséquent, vérifiez votre code avec les options suivantes,

essayez avec une valeur de champ de saisie masquée:

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

Vous pouvez également utiliser un modèle de lame de formulaire:

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

Cela va automatiquement ajouter du code CSRF dans votre script html

Une dernière chose à inclure dans la section <head> est:

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

Ça marche pour moi. 

<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

J'ai utilisé le code suivant. Cela fonctionne parfaitement.

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