Comment passer laravel valeur du jeton CSRF à vue
j'ai ce formulaire où l'utilisateur doit uniquement type de texte à l'intérieur d'une zone de texte:
<form action="#" v-on:submit="postStatus">{{-- Name of the method in Vue.js --}}
<div class="form-group">
<textarea class="form-control" rows="5" maxlength="140" autofocus placeholder="What are you upto?" required v-model="post"></textarea>
</div>
<input type="submit" value="Post" class="form-control btn btn-info">
{{ csrf_field() }}
</form>
alors, j'ai ce code de script où j'utilise vue.js avec ajax afin de passer ce texte dans un contrôleur et éventuellement l'enregistrer dans la base de données:
//when we actually submit the form, we want to catch the action
new Vue({
el : '#timeline',
data : {
post : '',
},
http : {
headers: {
'X-CSRF-Token': $('meta[name=_token]').attr('content')
}
},
methods : {
postStatus : function (e) {
e.preventDefault();
console.log('Posted: '+this.post+ '. Token: '+this.token);
$.ajax({
url : '/posts',
type : 'post',
dataType : 'json',
data : {
'body' : this.post,
}
});
}
},
});
cependant, cela ne fonctionne pas jusqu'à présent, puisqu'il y a cette exception d'inadéquation des tokens. Je ne sais pas comment le faire fonctionner. Comment passer cette valeur de token au controller. J'ai essayé le code suivant:
1) dans le formulaire, j'ai ajouté un nom de vue au token:
<input type="hidden" name="_token" value="YzXAnwBñC7qPK9kg7MGGIUzznEOCi2dTnG9h9çpB" v-model="token">
2) j'ai essayé de passer cette valeur de jeton dans la vue:
//when we actually submit the form, we want to catch the action
new Vue({
el : '#timeline',
data : {
post : '',
token : '',
},
methods : {
postStatus : function (e) {
e.preventDefault();
console.log('Posted: '+this.post+ '. Token: '+this.token);
$.ajax({
url : '/posts',
type : 'post',
dataType : 'json',
data : {
'body' : this.post,
'_token': this.token,
}
});
}
},
});
... mais dans la console, vue ne l'attrape même pas: (
Ce qui m'amène à l'erreur suivante:
TokenMismatchException in VerifyCsrfToken.php ligne 68:
Comment puis-je résoudre ce problème? Des idées?
4 réponses
Very Easy Solution
Il suffit d'ajouter un champ caché à l'intérieur du formulaire. Un Exemple
<form id="logout-form" action="/logout" method="POST" style="display: none;">
<input type="hidden" name="_token" :value="csrf">
</form>
Maintenant, ajouter csrf
variable à l'intérieur de script au fichier vue, comme ceci. (Rappelez-vous, il doit être à l'intérieur ).
<script>
export default {
data: () => ({
csrf: document.querySelector('meta[name="csrf-token"]').getAttribute('content'),
}),
}
</script>
N.B. Vous verrez une balise meta dans votre blade.php
fichier comme ceci.
<!-- CSRF Token -->
<meta name="csrf-token" content="{{ csrf_token() }}">
S'il n'y a rien de tel, vous devez le placer là.
simplement, je suggérerais de mettre ceci dans votre fichier PHP:
<script>
window.Laravel = <?php echo json_encode(['csrfToken' => csrf_token()]); ?>
</script>
de cette façon vous êtes en mesure d'importer facilement votre csrfToken de la partie JS (Vue dans ce cas).
de plus, si vous insérez ce code dans votre fichier PHP layout, vous pouvez utiliser le token par n'importe quel composant de votre application, puisque window
est une variable globale JS.
ma solution est que tous les composants d'Evi obtiennent un jeton csrf juste avant qu'une requête ne soit faite. J'ai mis ça dans mon bootstrap.fichier js.
Vue.http.interceptors.push((request, next) => {
request.headers.set('X-CSRF-TOKEN', CoolApp.csrfToken);
next();
});
alors avoir un CoolApp de classe.php
public function getScriptVariables()
{
return json_encode([
'csrfToken' => csrf_token(),
]);
}
je l'ai résolu grâce à ces deux réponses:
1) j'ai d'Abord lu celui-ci, qui m'a conduit à
2) Ceci second.
Donc, dans mon formulaire j'ai garder ceci:
{{ csrf_field() }}
Et dans le fichier js, je n'ajoute suivants (à l'extérieur et au-dessus de la Vue, par exemple:
var csrf_token = $('meta[name="csrf-token"]').attr('content');
Donc tout le code js:
var csrf_token = $('meta[name="csrf-token"]').attr('content');
/*Event handling within vue*/
//when we actually submit the form, we want to catch the action
new Vue({
el : '#timeline',
data : {
post : '',
token : csrf_token,
},
methods : {
postStatus : function (e) {
e.preventDefault();
console.log('Posted: '+this.post+ '. Token: '+this.token);
$.ajax({
url : '/posts',
type : 'post',
dataType : 'json',
data : {
'body' : this.post,
'_token': this.token,
}
});
}
},
});