web-dev-qa-db-fra.com

TokenMismatchException dans la ligne 67 de VerifyCsrfToken.php

Je sais que c'est une erreur connue avec des choses comme les formes à Laravel. Mais je suis confronté à un problème d'authentification de base dans Laravel 5.2. 

J'ai créé l'auth en utilisant Laravel;

php artisan make:auth

Maintenant, j'ai la même copie de code sur mon serveur et mon local. Dans ma section locale, je ne reçois aucun problème. Cependant, sur mon serveur, lorsque j'essaie d'enregistrer un utilisateur, le message d'erreur TokenMismatchException in VerifyCsrfToken.php Line 67 s'affiche.

Mon environnement local et celui de mon serveur sont synchronisés, mais l'erreur persiste quand je m'inscris. Toute aide sur comment je peux résoudre ce problème?

 Screenshot of Error

48
Gaurav Mehta

Je suppose que vous avez ajouté $this->middleware('auth'); dans le constructeur de votre contrôleur pour que l'authentification fonctionne. Ajoutez également les éléments suivants en haut, sous vos formulaires de connexion/enregistrement, si vous utilisez {!! Form::someElement !!}:

{!! csrf_field() !!}

Ou, si vous utilisez des balises d’entrée dans vos formulaires, ajoutez simplement ceci juste après la balise <form>:

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

À votre santé.

68
Shoaib Raza

J'ai eu un problème similaire et c'était une solution facile.

Ajoutez ceci dans votre zone de balise méta HTML:

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

Ensuite, sous votre référence JQuery, ajoutez ce code:

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

Si vous utilisez le formulaire HTML submit (pas AJAX), vous devez indiquer:

{{ csrf_field() }} 

dans vos balises de formulaire.

12
Jay Geeth

J'étais sur le point de commencer à me tirer les cheveux!

Veuillez vérifier votre domaine de cookie de session dans le fichier session.php config. Il existe une option de domaine qui doit correspondre à votre environnement et il est recommandé d’avoir ce fichier .env configurable avec vous pour le développement.

'domain' => env('COOKIE_DOMAIN', 'some-sensible-default.com'),
9
cmptrwizard

Vous devez avoir cette ligne de code dans la section de votre document HTML, vous pouvez le faire par défaut, cela ne fera aucun mal:

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

Et dans votre formulaire, vous devez ajouter ce champ de saisie masqué:

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

Ça a marché pour moi.

9
joronimo

Si rien ne fonctionne, vous pouvez supprimer le contrôle de sécurité CSRF en accédant au fichier App/Http/Middleware/VerifyCsrfToken.php et en ajoutant vos itinéraires à protected $ excpt.

par exemple. si je veux supprimer la protection CSRF de tous les itinéraires.

protected $except = [
    '/*'
];

Le P, bien que c’est une bonne pratique d’inclure la protection des CSRF.

8
Hasnat

Je rencontrais le même problème avec mon application fonctionnant sous laravel 5.4

php artisan session:table
php artisan make:auth
php artisan migrate

.. puis la commande suivante fonctionne pour moi :)

chmod 777 storage/framework/sessions/

Une autre possibilité de ce problème, si vous avez défini SESSION_DOMAIN (en .env) différent de Host_NAME

Bonne codage

6
Manish Nakar

Ce problème peut être provoqué par de nombreuses possibilités ..__ Permettez-moi d’en mentionner un. Avez-vous déjà modifié votre fichier de configuration session.php? .__ Peut-être avez-vous modifié la valeur de domain de null à votre nom de site ou à tout autre élément du fichier session.php

'domain' => null,

Une mauvaise configuration dans ce fichier peut provoquer ce problème.

5
Yasir Ijaz

J'ai également fait face au même problème et je l'ai résolu plus tard .

php artisan cache: effacer

Et après cela, redémarrez le projet… .. espérons que cela vous aidera. 

5
Hola

J'ai aussi cette erreur, mais j'ai résolu le problème. Si vous utilisez php artisan serve, ajoutez ce code {{ csrf_field() }} sous {!! Form::open() !!}

  1. php artisan cache: effacer
  2. Effacer le cache et les cookies du navigateur
  3. Utilisation d'un navigateur privé (Mozilla)/Fenêtre de navigation privée (Chrome)
  4. Ouvrez votre formulaire/page et soumettez à nouveau les gars

J'espère que cela résoudra votre problème.

3
iwan.webdeveloper

Assure-toi

{!! csrf_field() !!}

est ajouté dans votre formulaire dans la syntaxe de la lame.

ou en syntaxe de forme simple

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

de plus, assurez-vous que, dans session.php (dans le dossier config), ce qui suit est défini correctement.

'domain' => env('SESSION_DOMAIN', 'sample-project.com'),

ou mettre à jour le même fichier .env comme,

SESSION_DOMAIN=sample-project.com

Dans mon cas {!! csrf_field () !!} a été ajouté correctement mais SESSION_DOMAIN n'a pas été configuré correctement. Après que je l'ai changé avec la valeur correcte dans mon fichier .env, cela a fonctionné.

3
Anup_Tripathi

Votre méthode de formulaire est post. Alors ouvrez le fichier .php Middleware/VerifyCsrfToken, trouvez la méthode isReading () et ajoutez la méthode 'POST' dans array.

3
Bhagwan Gurav

changer le pilote de session dans le fichier session.php pour que le mien soit défini sur array.

2
msonowal

Peut également se produire si l'utilisateur 'www-data' n'a pas de permission d'accès/écriture Sur le dossier: 'Laravel-project-folder'/storage/framework/sessions /

2
Grigoreas P.

Avez-vous vérifié votre champ de saisie masqué où le jeton est généré?

Si elle est nulle, votre jeton n'est pas renvoyé par la fonction csrf_token.Vous devez écrire votre itinéraire qui restitue le formulaire à l'intérieur du groupe de middleware fourni par laravel comme suit:

  Route::group(['middleware' => 'web'], function () {
Route::get('/', function () {
    return view('welcome');
});

Ici, la route racine contient ma page d'inscription qui nécessite le jeton csrf. Ce jeton est géré par laravel 5.2.7 dans le middleware 'web' de kernel.php.

N'oubliez pas d'insérer {!! csrf_field () !!} à l'intérieur du formulaire ..

1
sunil

Mettez ce code entre les balises <form> et </form>:

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

Ci-dessous a fonctionné pour moi.

<input type = "hidden" name = "_token" value = "<?php echo csrf_token(); ?>">
1
Tousif Ahmed

Allez à app/provides.

Ensuite, dans le fichier RouteServiceProvider.php, vous devrez supprimer 'middleware' => 'web' dans protected function mapWebRoutes(Router $router)

1

Pour moi, je devais utiliser https sécurisé plutôt que http.

0
TylersSN

Vous pouvez résoudre en supprimant la ligne. allez à app\http\kernel.php, vous pouvez voir ici la ligne\App\Http\Middleware\VerifyCsrfToken :: class, cela a fonctionné pour moi. 

0
Joseph Carlo

Allez dans votre dossier laravel :: App/http/Middleware/VerifyCsrfToken.php

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;

class VerifyCsrfToken extends BaseVerifier
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        // Pass your URI here. example ::

        '/employer/registration'
    ];
}

Et cela exclura cette URL de la validation Csrf. Travaille pour moi.

0

Le problème avec moi était de réduire la valeur post_max_size dans le fichier php.ini.

0
Mindau

Par défaut, les cookies de session ne sont renvoyés au serveur que si le navigateur dispose d'une connexionHTTPS. Vous pouvez le désactiver dans votre fichier .env (déconseillé pour la production)

SESSION_SECURE_COOKIE=false

Ou vous pouvez le désactiver dans config/session.php

'secure' => false,
0
mukama

Si vous vérifiez certains des formulaires par défaut de Laravel 5.4, vous verrez comment cela se fait:

<form class="form-horizontal" role="form" method="POST" action="{{ route('password.email') }}">
  {{ csrf_field() }}

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

    <div class="col-md-6">
      <input id="email" type="email" class="form-control" name="email" value="{{ old('email') }}" required> @if ($errors->has('email'))
      <span class="help-block">
                                        <strong>{{ $errors->first('email') }}</strong>
                                    </span> @endif
    </div>
  </div>

  <div class="form-group">
    <div class="col-md-6 col-md-offset-4">
      <button type="submit" class="btn btn-primary">
                                    Send Password Reset Link
                                </button>
    </div>
  </div>
</form>

{{ csrf_field() }}

est le moyen le plus approprié d'ajouter un champ caché personnalisé que Laravel comprendra.

csrf_filed() utilise csrf_token() à l'intérieur, comme vous pouvez le voir:

if (! function_exists('csrf_field')) {
    /**
     * Generate a CSRF token form field.
     *
     * @return \Illuminate\Support\HtmlString
     */
    function csrf_field()
    {
        return new HtmlString('<input type="hidden" name="_token" value="'.csrf_token().'">');
    }
}

Et la méthode csrf_field() utilise une session pour le travail.

function csrf_token()
{
    $session = app('session');

    if (isset($session)) {
        return $session->token();
    }

    throw new RuntimeException('Application session store not set.');
}
0
prosti

J'ai eu cette erreur lors du téléchargement de gros fichiers (vidéos). La forme fonctionnait bien, aucune erreur d'incompatibilité, mais dès qu'une personne joint un fichier vidéo volumineux, cette erreur de jeton était générée. L'ajustement de la taille de fichier maximale autorisée et l'augmentation du temps de traitement ont résolu ce problème pour moi. Vous ne savez pas pourquoi Laravel génère cette erreur, mais voici une solution potentielle supplémentaire pour vous.

Voici une réponse de StackOverflow qui explique plus en détail comment résoudre le problème de téléchargement de fichiers volumineux.

PHP change la taille maximale du fichier de téléchargement

0
Strixy

J'ai eu le même problème, mais je l'ai résolu en corrigeant mon formulaire comme indiqué ci-dessous:

{!!Form::open(['url'=>route('auth.login-post'),'class'=>'form-horizontal'])!!}

Si cela ne résout pas votre problème, pouvez-vous indiquer comment vous avez ouvert le formulaire?

0
Himakar

Dans mon cas, j'ai eu un problème en essayant de me connecter après le redémarrage du serveur, mais j'avais le champ csrf dans le formulaire et je n'ai pas actualisé la page, ou cela a gardé quelque chose de faux dans le cache. 

C'était ma solution. Je mets ce morceau de code dans\App\Http\Middleware\VerifyCsrfToken.php

public function handle($request, Closure $next)
{
    try {
        return parent::handle($request, $next); // TODO: Change the autogenerated stub
    } catch(TokenMismatchException $e) {
        return redirect()->back();
    }
}

Cela consiste à intercepter l'exception TokenMismatchException, puis à rediriger l'utilisateur vers la page (pour recharger le jeton csrf dans l'en-tête et dans le champ). Cela ne fonctionne peut-être pas toujours, mais cela a fonctionné pour mon problème.

0
Imaginaroom

Essayez php artisan cache: effacez ou supprimez manuellement le cache de stockage du serveur.

0
Nikhil Radadiya

Le redirigez-vous après le post? J'ai eu ce problème et j'ai pu le résoudre en retournant la même vue au lieu d'utiliser le Redirect :: back ().

Utilisez cette vue de retour () -> avec (), au lieu de Redirect :: back ().

0
Pele

essayez de changer la durée de vie de la session sur config/session.php comme ceci:

'lifetime' => 120, à 'lifetime' => 360,

Ici, je fixe la durée de vie à 360, espérons cette aide.

0
Satia

J’ai eu le même problème lorsque j’ai essayé Laravel 5.2 au début, puis j’ai appris à ajouter {{!! csrf_field() !!}} dans le formulaire et cela l’a résolu. Mais plus tard, j'ai appris l'existence de Form Helpers, cela prend en charge la protection des CSRF et ne génère aucune erreur. Bien que les aides de formulaire ne soient pas légitimement disponibles après Laravel 5.2, vous pouvez toujours les utiliser à partir de LaravelCollective .

0
zEELz

Tu devrais essayer ça.

Ajoutez {{csrf_field ()}} juste après votre balise d’ouverture de formulaire comme ceci.

<form method="POST" action="/your/{{ $action_id }}">
{{ csrf_field() }}    
0
Odera Okonkwo
output_buffering=4096;
always_populate_raw_post_data=-1;
upload_max_filesize=120M;

créer le fichier user.ini dans public_html et mettre les trois valeurs précédentes dans le fichier user.ini résolu mon problème 

0
irfan majeed

Utiliser comme ça

<form>
<input type="hidden" name="_token" value="<?= csrf_token(); ?>" />
0
antelove