これは、Laravelのフォームなどの既知のエラーであることを知っています。しかし、Laravel 5.2の基本認証の問題に直面しています。
Laravelを使用して認証を作成しました。
php artisan make:auth
これで、サーバーとローカルに同じコードのコピーがあります。私の地元では、まったく問題はありません。ただし、サーバー上でユーザーを登録しようとすると、TokenMismatchException in VerifyCsrfToken.php Line 67
というエラーが表示されます
ローカル環境とサーバー環境の両方が同期していますが、登録時にエラーが発生し続けます。これを修正する方法についてのヘルプはありますか?
認証を機能させるために、コントローラーのコンストラクター内に$this->middleware('auth');
を追加したと想定しています。ログイン/登録フォームで、{!! Form::someElement !!}
を使用している場合は、上部に次の行も追加します。
{!! csrf_field() !!}
または、フォーム内で入力タグを使用している場合は、<form>
タグの後に次の行を追加します。
<input type="hidden" name="_token" value="{{ csrf_token() }}">
お役に立てれば。
同様の問題があり、簡単に修正できました。
これをHTMLメタタグ領域に追加します。
<meta name="csrf-token" content="{{ csrf_token() }}">
次に、JQueryリファレンスの下に次のコードを追加します。
<script type="text/javascript">
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
</script>
HTMLフォーム送信(AJAXではない)を使用している場合は、以下を配置する必要があります。
{{ csrf_field() }}
フォームタグ内。
私は髪を抜こうとしました!
Session.php configでセッションCookieドメインを確認してください。ご使用の環境に一致する必要があるドメインオプションがあり、これを開発用の.envファイルで構成できるようにすることをお勧めします。
'domain' => env('COOKIE_DOMAIN', 'some-sensible-default.com'),
HTMLドキュメントのセクションに次のコード行が必要です。デフォルトでそれを行うことができますが、害はありません。
<meta name="csrf-token" content="{{ csrf_token() }}" />
そして、フォームに次の非表示の入力フィールドを追加する必要があります。
<input type="hidden" name="_token" value="{{ csrf_token() }}">
それはそれで、私のために働いた。
何も機能していない場合は、App/Http/Middleware/VerifyCsrfToken.phpファイルに移動し、保護された$ excptにルートを追加して、CSRFセキュリティチェックを削除できます。
例えばすべてのルートからCSRF保護を削除する場合。
protected $except = [
'/*'
];
P.S。ただし、CSRF保護を含めることをお勧めします。
laravel 5.4で実行しているアプリケーションで同じ問題に直面していました
php artisan session:table
php artisan make:auth
php artisan migrate
..そして、次のコマンドが私のために働く:)
chmod 777 storage/framework/sessions/
Host_NAMEとは異なるSESSION_DOMAIN(.env)を設定した場合、この問題のもう1つの可能性
ハッピーコーディング
この問題を引き起こす可能性のある可能性はたくさんあります。ひとつ言及させてください。たぶん、session.php構成ファイルを変更しましたか? domainの値をnullからあなたのサイト名またはsession.phpの何かに変更した可能性があります
'domain' => null,
このファイルの設定が間違っていると、この問題が発生する可能性があります。
私も同じ問題に直面し、後でそれを解決しました。まず、artisanコマンドを実行します。
pHPアーティザンキャッシュ:クリア
その後、プロジェクトを再起動します。それが役立つことを願っています。
フォームメソッドは投稿です。ミドルウェア/ VerifyCsrfToken .phpファイルを開き、isReading()メソッドを見つけて、配列に「POST」メソッドを追加します。
このエラーも表示されますが、問題は解決しました。 php artisan serve
を使用している場合は、このコード{{ csrf_field() }}
を{!! Form::open() !!}
の下に追加します
これで問題が解決することを願っています。
確認してください
{!! csrf_field() !!}
フォーム内のブレード構文に追加されます。
または単純な形式の構文で
<input type="hidden" name="_token" value="{{ csrf_token() }}">
これとともに、session.php(configフォルダー内)で、以下が正しく設定されていることを確認してください。
'domain' => env('SESSION_DOMAIN', 'sample-project.com'),
または、.envファイルで同じように更新します、
SESSION_DOMAIN=sample-project.com
私の場合 {!! csrf_field()!!}は正しく追加されましたが、SESSION_DOMAINは正しく構成されていません。 .envファイルで正しい値に変更した後、機能しました。
session.phpのセッションドライバーをファイルmineが配列に設定されているように変更します。
「www-data」ユーザーがフォルダに対するアクセス/書き込み権限を持っていない場合にも発生する可能性があります:「laravel-project-folder」/ storage/framework/sessions /
以下は私のために働いた。
<input type = "hidden" name = "_token" value = "<?php echo csrf_token(); ?>">
デフォルトでは、ブラウザにHTTPS接続がある場合にのみ、セッションCookieがサーバーに送り返されます。 .envファイルで無効にすることができます(本番用に非表示)
SESSION_SECURE_COOKIE=false
または、config/session.phpでオフにすることができます
'secure' => false,
トークンが生成される非表示の入力フィールドを確認しましたか?
Nullの場合、トークンはcsrf_token関数によって返されません。次のように、laravelによって提供されるミドルウェアグループ内のフォームをレンダリングするルートを記述する必要があります。
Route::group(['middleware' => 'web'], function () {
Route::get('/', function () {
return view('welcome');
});
ここで、ルートルートにはcsrfトークンを必要とするサインアップページが含まれています。このトークンは、kernel.phpの「Web」ミドルウェア内のlaravel 5.2.7によって管理されます。
{!!を挿入することを忘れないでくださいフォーム内のcsrf_field()!!}.
このコードを<form>
と</form>
タグの間に配置します。
<input type="hidden" name="_token" value="{{ csrf_token() }}">
app/provides
に移動します。
次に、ファイルRouteServiceProvider.php
で、protected function mapWebRoutes(Router $router)
の'middleware' => 'web'
を削除する必要があります。
私にとっては、httpではなく安全なhttpsを使用する必要がありました。
行を削除することで解決できます。 app\http\kernel.phpに移動すると、\ App\Http\Middleware\VerifyCsrfToken :: classの行が表示されます。これでうまくいきました。
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'
];
}
そして、このURLをCsrf検証から除外します。私のために働く。
私による問題は、php.iniのpost_max_sizeの値が小さいことでした。
Laravel 5.4のデフォルトフォームのいくつかをチェックすると、これがどのように行われているかがわかります。
<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() }}
Laravelが理解するカスタムの非表示フィールドを追加する最も適切な方法です。
ご覧のとおり、csrf_filed()
は内部でcsrf_token()
を使用します。
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().'">');
}
}
また、csrf_field()
メソッドはジョブにセッションを使用します。
function csrf_token()
{
$session = app('session');
if (isset($session)) {
return $session->token();
}
throw new RuntimeException('Application session store not set.');
}
大きなファイル(ビデオ)をアップロードするときにこのエラーが発生しました。フォームは正常に機能し、ミスマッチエラーはありませんでしたが、誰かが大きなビデオファイルを添付するとすぐに、このトークンエラーがスローされました。最大許容ファイルサイズを調整し、処理時間を長くすると、この問題は解決しました。この場合Laravelがこのエラーをスローする理由はわかりませんが、もう1つの解決策があります。
StackOverflowの回答は、大きなファイルのアップロードの問題を解決する方法について詳しく説明しています。
私は同じ問題を抱えていましたが、以下に示すようにフォームを開いて修正することで解決しました:
{!!Form::open(['url'=>route('auth.login-post'),'class'=>'form-horizontal'])!!}
これで問題が解決しない場合は、フォームを開いた方法を示してください。
私の場合、サーバーを再起動した後にログインしようとしたときに問題が発生しましたが、フォームにcsrfフィールドがあり、ページを更新しなかったか、キャッシュに何か問題がありました。
これが私の解決策でした。このコードを\ 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();
}
}
TokenMismatchExceptionをキャッチしてから、ユーザーをページにリダイレクトし直します(ヘッダーとフィールドにcsrfトークンをリロードします)。常に機能するとは限りませんが、私の問題には機能しました。
Php artisan cache:clearを試すか、サーバーからストレージキャッシュを手動で削除します。
投稿後にリダイレクトしますか?この問題があり、Redirect :: back()を使用する代わりに同じビューを返すことで解決できました。
Redirect :: back()の代わりに、このreturn view()-> with()を使用します。
このようにconfig/session.php
でセッションの有効期間を変更してみてください:
'lifetime' => 120,
から'lifetime' => 360,
ここでは、有効期間を360に設定します。これが役立つことを願っています。
最初にLaravel 5.2を試したときに同じ問題が発生しました。その後、フォームに追加される{{!! csrf_field() !!}}
について学び、それを解決しました。しかし、後でフォームヘルパーについて学びました。これはCSRF保護の面倒をみて、エラーを出しません。フォームヘルパーはLaravel 5.2以降では正当に利用できませんが、 LaravelCollective から引き続き使用できます。
これを試してみてください。
{{csrf_field()}}をフォーム開始タグの直後に追加します。
<form method="POST" action="/your/{{ $action_id }}">
{{ csrf_field() }}
output_buffering=4096;
always_populate_raw_post_data=-1;
upload_max_filesize=120M;
public_htmlにuser.iniファイルを作成し、user.iniファイルに上記の3つの値を入力すると問題が解決しました
このように使用する
<form>
<input type="hidden" name="_token" value="<?= csrf_token(); ?>" />