こんにちはcsrfトークン値がnullなのはなぜですか?そして、トークンを使用しない場合、TokenMismatchException !!!!どうすれば修正できますか?
さらに掘り下げたところ、セッションがSessionServiceProviderに登録されていないことがわかりました。これがデフォルトで機能するために有効にする必要があるものはありますか?私はLaravel初心者なので、上記のアドバイスに従う方法がわかりません。ルートが「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>
ルートにwebマイルドウェアが適用されていることを確認してください。
セッション、csrf保護、暗号化されたcookie、セッションエラーなどを必要とするほとんどすべてのルート...「web」ミドルウェアグループを適用する必要があります。
ルートグループのroutes.phpファイルを次のように確認します。
Route::group(['middleware' => 'web'], function () {
//
});
更新: 5.2.27以降、RouteServiceProvider
はすべてのルートをroutes.php
は、web
ミドルウェアが適用されたルートグループ内にあります。
バージョン5.2では、ルートを次の場所に移動します。
Route::group(['middleware' => ['web']], function () {
//Your route here
});
フォームでトークンを使用する2つの方法があります( https://laravel.com/docs/master/routing#csrf-protection ):
// Vanilla PHP
<?php echo csrf_field(); ?>
// Blade Template Syntax
{{ csrf_field() }}
または
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
セッションパスは書き込み可能であることを確認してください。そうでない場合、laravelはnull(セッショントークンなし)を$_POST['_token']
値と比較し、実際の理由にもかかわらず不一致エラーをスローします。
使用する
{!! csrf_token() !!}
の代わりに
{{ csrf_token() }}
誰かがまだこの問題に直面している場合に備えて、
inside config/session.php私のセッションは本質的には機能していませんでした(しばらくの間は大丈夫に見えたとしても)
'domain'変数がnull!に設定されていることを確認してください
実際に私の問題である他のもののどれもとして私のためにすべてを修正しました。
それが誰かを助けることを願っています。
VerifyCsrfToken.phpをミドルウェアフォルダーからこれに編集します。
<?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;
}
}
私はあなたと同じ問題を抱えています、私はLaravel 5.2です、フォームにトークンフィールドもありますが、まだ「TokenMismatch」のエラーが非常に迷惑です?
これには多くの原因がある可能性があるため、これは非常に深い問題だと思います。私にとっては、Laravel 5.1から5.2にアップグレードしていました。また、データベースを使用してセッションを保存しています。このエラーが発生しましたが、laravelエラーログ(/ storage/logs)Laravel 5.2はセッションテーブルにuser_id、ip_address、user_agentフィールドがあることを期待しています。アップグレード前と同じように機能したため、エラーログを確認することをお勧めします。
この回答は、<form>
ファイルのview.blade.php
タグの後に既に{{ csrf_field() }}
を使用しており、php artisan key:generate
コマンドも実行しているが、まだトークン不一致エラーが発生しているすべての人を対象としています。これらは、開発中のプロジェクトの1つでTokenMismatchExceptionエラーを解決するために行った手順です。
laravelプロジェクト内の次の2つのフォルダーからキャッシュファイルを削除します。
キャッシュファイルを削除した後、ブラウザのキャッシュをクリアします。
あなたはこれを使うことができます:
<form method="POST" action="/addUser" >
{!! csrf_field() !!}
...
</form>
このフォームのセキュリティを検証しないためには、Laravelのファイルパスconfig/auth.phpに移動する必要があります。そのファイルでは、'no_csrf' => array(),
という行を見つける(または作成する)必要があります。この行は、セキュリティを検証できないルートを追加するためのものです。この配置では、次のようなパスをフォームに追加する必要があります。
'No_csrf' => array('/form'),
おそらくこれを使用できます:(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>
同じ問題がありました。すべてのファイルをセッションフォルダーに削除することで解決しました。セッションフォルダーのパスは次のとおりです。yourApplication/ storage/framework/sessions /
この問題を確認できます。csrf_token()とcsrf_field()の両方がLaravel 5.2。で空のトークンフィールドを生成します。ドキュメントによると、両方のメソッドはまだ動作するはずですが、そうは見えません。 。私のインストールは完全に新鮮なので、ドキュメントが間違っているか、バグが存在します。