Bonjour, pourquoi la valeur de mon jeton csrf est-elle nulle? Et quand je n'utilise pas de jeton, je n'ai pas TokenMismatchException !!!! Comment puis-je le réparer?
J'ai creusé plus profondément et constaté qu'une session n'est pas en cours d'enregistrement dans SessionServiceProvider. Y a-t-il quelque chose qui doit être activé pour que cela fonctionne par défaut? Puisque je suis un débutant = Laravel, je ne sais pas trop comment suivre les conseils ci-dessus. Comment puis-je m'assurer que mes itinéraires sont ajoutés dans le groupe "Web"?
<form method="post" action="<?php echo url('/form'); ?>">
<input type="hidden" name="_Token" value="{{ csrf_token() }}">
<input type="text" name="Title" placeholder="Title"><br>
<textarea rows="10" name="Content" placeholder="Content"></textarea><br>
<input type="submit" value="Send">
</form>
Assurez-vous que le programme web milddleware est appliqué à votre itinéraire.
Quasiment tous les itinéraires où vous voudrez des sessions, une protection csrf, des cookies cryptés, des erreurs de session, etc ... vous aurez besoin du groupe de middleware 'web' appliqué.
Vérifiez votre fichier routes.php pour le groupe de routes comme ceci:
Route::group(['middleware' => 'web'], function () {
//
});
Mise à jour: Depuis 5.2.27 La RouteServiceProvider
place maintenant tous vos itinéraires dans routes.php
dans un groupe d’itinéraires auquel le middleware web
est appliqué.
Dans la version 5.2: vous déplacez Route dans:
Route::group(['middleware' => ['web']], function () {
//Your route here
});
Avoir deux façons d'utiliser Token dans le formulaire ( https://laravel.com/docs/master/routing#csrf-protection ):
// Vanilla PHP
<?php echo csrf_field(); ?>
// Blade Template Syntax
{{ csrf_field() }}
Ou
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
Assurez-vous que le chemin de session est accessible en écriture . Si ce n'est pas le cas, laravel compare null (pas de jeton de session) avec la valeur $ _POST ['_kken'] et génère une erreur de correspondance malgré la vraie raison.
utilisation
{!! csrf_token() !!}
au lieu de
{{ csrf_token() }}
Juste au cas où quelqu'un frappe encore ce problème,
inside config/session.php mes sessions ne fonctionnaient pas (même si elles semblaient bien pendant un moment)
Assurez-vous que la variable ' domain ' est définie sur null !
Tout corrigé pour moi comme aucune des autres choses où en fait mon problème.
J'espère que ça aide quelqu'un.
Modifiez votre dossier VerifyCsrfToken.php à partir du middleware dans ce dossier.
<?php namespace App\Http\Middleware;
use Closure;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
class VerifyCsrfToken extends BaseVerifier {
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$response = $next($request);
$response->headers->set('Access-Control-Allow-Origin' , '*');
$response->headers->set('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE');
$response->headers->set('Access-Control-Allow-Headers', 'Content-Type, Accept, Authorization, X-Requested-With, Application');
return $response;
}
}
J'ai le même problème que vous, je suis sur Laravel 5.2, j'ai aussi un champ de jetons sur mon formulaire mais je me fais quand même l'erreur de "TokenMismatch" très ennuyeux, n'est-ce pas?
Je pense que c'est un problème assez grave car il peut y avoir de nombreuses causes à cela . Pour moi, je passais de Laravel 5.1 à 5.2. J'utilise également la base de données pour stocker mes sessions . Il me donnait cette erreur, mais quand j'ai vérifié les journaux d'erreurs Laravel (/ storage/logs), j'ai constaté que Laravel 5.2 s'attend à ce que la table de session ait user_id , champs ip_address et user_agent. La mienne non. Lorsque j’ai ajouté ces champs, tout fonctionnait de la même manière qu’avant la mise à niveau . Mon conseil est donc de consulter le journal des erreurs!
Cette réponse s’adresse à toutes les personnes qui ont déjà utilisé {{ csrf_field() }}
après la balise <form>
dans leur fichier view.blade.php
et ont également exécuté la commande php artisan key:generate
mais obtiennent toujours l'erreur Token Mismatch. Voici les étapes que j'ai suivies pour résoudre l'erreur TokenMismatchException pour l'un de mes projets en cours de développement.
Supprimez les fichiers de cache des deux dossiers suivants de votre projet laravel:
Après avoir supprimé les fichiers de cache, effacez le cache de votre navigateur.
J'ai le même problème. Je n'ai pas trouvé comment résoudre un problème fondamental, mais je pense qu'il s'agit d'un correctif décent: Laravel 5.x: Rediriger les erreurs CSRF vers la page précédente
Au lieu de cela, jetez TokenMismatchException
redirect
user à la page précédente avec le message d'erreur.
Pour le faire, override
VerifyCsrfToken.($request, Closure $next)
, méthode.
Ouvrez App\Http\Middleware\VerifyCsrfToken.php
et allez à la classe de base (Illuminate\Foundation\Http\Middleware\VerifyCsrfToken
) et copiez la méthode dans App\Http\Middleware\VerifyCsrfToken.php
et changez la ligne qui jette TokenMismatchException
pour rediriger vers la page précédente. ajoutez également import use Closure;
. Donc, après toutes les modifications, App\Http\Middleware\VerifyCsrfToken.php
ressemblera à:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
/**
* Class VerifyCsrfToken
* @package App\Http\Middleware
*/
class VerifyCsrfToken extends BaseVerifier
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
//
];
public function handle($request, Closure $next)
{
if (
$this->isReading($request) ||
$this->runningUnitTests() ||
$this->shouldPassThrough($request) ||
$this->tokensMatch($request)
) {
return $this->addCookieToResponse($request, $next($request));
}
//throw new TokenMismatchException;
return Redirect::back()->withError('Sorry, we could not verify your request. Please try again.');
}
}
La solution 2 consiste à utiliser Caféine Pour Laravel .
Caffeine For Laravel est un package conçu pour empêcher les utilisateurs du jeton CSRF d’expirer sur votre site lors du remplissage d’un formulaire.
Mike, le créateur du paquet, souhaitait disposer d’un moyen sécurisé de simplifier la vie des utilisateurs qui prenaient le temps de remplir des formulaires en veillant à ce que le jeton reste éveillé grâce à un appel en coulisse.
Vous pouvez simplement utiliser ceci:
<form method="POST" action="/addUser" >
{!! csrf_field() !!}
...
</form>
Pour ne pas vérifier la sécurité sur ce formulaire, vous devez vous rendre au chemin du fichier: config/auth.php sur Laravel. Dans ce fichier, vous devez trouver (ou créer) la ligne 'no_csrf' => array(),
. Cette ligne doit ajouter les routes que la sécurité ne peut pas être vérifiée. Dans cet arrangement, vous devez ajouter le chemin d'accès à votre formulaire, tel que:
'No_csrf' => array('/form'),
Peut-être que vous pouvez utiliser ceci: (src = https://laravel.com/docs/5.2/routing )
<form action="/foo/bar" method="POST">
<input type="hidden" name="_method" value="PUT">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>
J'ai eu le même problème. Résolu en supprimant tous les fichiers du dossier sessions . Le chemin du dossier de sessions est le suivant:
Je peux confirmer ce problème, csrf_token () et csrf_field () produisent des champs de jetons vides dans Laravel 5.2. Selon la documentation, les deux méthodes devraient toujours fonctionner mais elles ne semblent pas le faire. Mon installation est complètement récente, donc la documentation est incorrecte ou un bogue est présent.