2015-12-22 23 views
8

Io sono solo inizio quindi per favore perdonami. Ho una solida conoscenza di CodeIgniter, quindi capisco cosa sta succedendo. Tuttavia, sto notando che il mio token CSRF è vuoto quando creo un modulo. Sto lavorando attraverso i video dei laracasts per ottenere un sussulto sul flusso di lavoro di Laravel.Perché il mio token CSRF è vuoto quando si utilizza Form :: open()?

myfile.blade.php

{!! Form::open((array('action' => '[email protected]'))) !!} 
    ... 
{{!! Form::close() !!}} 

Ecco quello che sto ottenendo quando visualizzo la fonte:

<form method="POST" action="http://mysite.dev/route" accept-charset="UTF-8"> 
<input name="_token" type="hidden"> 
</form> 

Ho guardato attraverso la directory di configurazione, ma vedo nulla su dover abilitare csrf. C'è un'impostazione aggiuntiva da qualche parte che devo aggiornare?

Grazie per i vostri suggerimenti.

EDIT

Anche questo mi dà un campo di input nascosto vuoto:

{{ Form::token() }} // <input name="_token" type="hidden"> 

EDIT

Ecco quello che sembra il mio controller simile:

//use Illuminate\Http\Request; 
use Request; 
use App\Article; 
use App\Http\Requests; 
use App\Http\Controllers\Controller; 


public function store(Request $request) 
{ 
    $input = Request::all(); 

    return $input; 
} 

Quindi il mio tag forma aggiornata si presenta così:

{!! Form::open((array('action' => '[email protected]'))) !!} 
... 

Quando mi presento, io posso vedere la risposta JSON - il token è ovviamente vuota.

{"_token":"","title":"test","body":"test"} 
+0

vedi la mia risposta @damon –

+0

Quale versione di Laravel stai usando? Inoltre, se stai guardando le serie fondamentali di Laravel, è un po 'obsoleto. –

+0

Ciao Thomas, sembra che io stia usando 5.2.3. Sto lavorando alla serie "Laravel 5 Fundamentals". – Damon

risposta

27

La serie Fondamentale laravel è per laravel 5.0 in modo da avere un paio di opzioni. Puoi installare Laravel 5.0 per continuare con quella serie. Per installare L5.0, è necessario eseguire il seguente comando:

composer create-project laravel/laravel {directory} "~5.0.0" --prefer-dist 

Se si desidera utilizzare laravel 5.2 anche se (che vi consiglio vivamente e Jeffrey Way sarà molto probabilmente rilascerà una serie su questo a breve), non ci sono molte cose extra da prendere in considerazione.

In primo luogo, mettere tutte le rotte all'interno di un gruppo di middleware "web" come questo:

Route::group(['middleware' => ['web']], function() { 

    // Put your routes inside here 

}); 

In passato, ci sono stati diversi middleware che correvano su ogni richiesta per impostazione predefinita. In 5.2, questo non è più il caso. Ad esempio, il token è memorizzato nella sessione, ma in 5.2, cose come il middleware "StartSession" non vengono applicate automaticamente. Di conseguenza, il middleware "web" deve essere applicato ai tuoi percorsi. Il motivo di questa modifica in 5.2:

I gruppi di middleware consentono di raggruppare più middleware di percorso sotto un'unica, comoda chiave, consentendo di assegnare più middleware a una rotta in una sola volta.Ad esempio, questo può essere utile quando si costruisce un'interfaccia utente Web e un'API all'interno della stessa applicazione. È possibile raggruppare le rotte di sessione e CSRF in un gruppo web e, forse, il limitatore di velocità nel gruppo api.

Inoltre, nella serie Laravel Fundamental, Jeffrey inserisce il pacchetto "illuminate/html", ma ora la maggior parte delle persone usa il pacchetto collettivo di laravel. Gestiscono molti dei pacchetti di Laravel che vengono portati fuori dal nucleo. Di conseguenza, rimuoverei il pacchetto "illuminate/html". Nel tuo file composer.json, rimuovi "illuminate/html: 5.0" (o qualunque cosa si trovi nella sezione richiesta). Inoltre, rimuovi il fornitore di servizi corrispondente e formatta le facciate che hai aggiunto al tuo file config/app.php.

Per installare la versione collettiva di laravel, aggiungere questo nel file composer.json: "laravelcollective/html": "5.2.*-dev". Quindi, eseguire composer update. Una volta fatto, nel file config/app.php, aggiungere questo al vostro array fornitori:

Collective\Html\HtmlServiceProvider::class, 

e aggiungere questo al vostro array alias:

'Form' => Collective\Html\FormFacade::class, 
'Html' => Collective\Html\HtmlFacade::class, 

spero non mi manca niente altro.

+0

Grazie mille per la tua risposta dettagliata. – Damon

+0

Questa sembra essere la risposta anche se mi chiedo ora se ... 'Route :: group (['middleware' => ['web']], function() ...' ... era abbastanza – greaterKing

+0

Sì, aggiungendo che per i tuoi percorsi era * probabilmente * sufficiente, ma è meglio spostarsi usando laravelcollective/html invece di illuminate/html perché è deprecato e causerà problemi più in basso. aggiornandolo tramite il compositore PRIMA di aggiungere le righe alla tua app.php altrimenti ti imbatterai in errori – Hanny

0

Dovrebbe essere

{!! Form::open((array('action' => '[email protected]'))) !!} 
    ... 
{!! Form::close() !!} 
+0

Ciao Adam, grazie per la risposta!Ho aggiornato il tuo suggerimento per utilizzare il mio metodo di controller effettivo e sto ancora ottenendo la stessa cosa. Un input nascosto senza valore. È qualcosa che sto facendo (o non facendo) che lo sta causando. Ho aggiornato la mia domanda per includere il controller completo. Forse c'è qualcosa che non riesco a includere. – Damon

2

Questo è un problema di configurazione Avete bisogno per impostare la chiave applicazione nel file di configurazione ...config/app.php in una stringa di 32 caratteri o utilizzare artigianale cli php artisan key:generate al genearte la chiave per voi di essere in grado di utilizzare il token CSRF.

Assicurarsi inoltre di includere rotte che utilizzano il token CSRF nella route di gruppo web.

Si può escludere URI definendo i loro percorsi al di fuori del gruppo di middleware web che viene incluso nel file routes.php di default, oppure aggiungendo gli URI al $ tranne proprietà del middleware VerifyCsrfToken: http://laravel.com/docs/5.2/routing#csrf-protection

0

ho risolto il problema di fornitore HtmlService realtà 5.2 versione rimosso illuminare e aggiungere collettiva seguire il passo per risolvere il problema:

  1. composer require laravelcollective/html
  2. composer update
  3. aggiungere in config/app.php

'providers' => ['Collective\Html\HtmlServiceProvider'], 'aliases' => [ 'Form' => 'Collective\Html\FormFacade', 'Html' => 'Collective\Html\HtmlFacade', ],

allora siete in grado di usare quella forma.

+0

Questo è difficile da leggere perché sembra tutto codice. Se potessi formattarlo meglio, sarebbe utile. –

1

Se si dispone di una pagina di login e si desidera cancellare la sessione utilizzando:

Session::flush(); 

Non dimenticate che questo pulisce anche il token CSRF prima che possa essere messo nella vista