Почтовый запрос Laravel 5.7 Ajax возвращает код состояния 419

Привет, я новичок в Laravel, и я пытаюсь создать форму входа с отправкой формы ajax.

Я скопировал и построил образец формы с шаблоном Metronic и попытался использовать запрос ajax для проверки входа в систему.

Мой код работает нормально, если я исключу его из проверки VerifyCsrfToken. Но я хочу, чтобы проверка токена работала.

Я прочитал несколько сообщений о токене csrf, пробовал, но все еще возвращает код состояния 419.

Извините за длинный код ниже, но вот они (Я знаю, что ничего не делал с настройкой сеансов и прочего, пожалуйста, пока проигнорируйте, потому что код в любом случае возвращает статус 419)

маршруты / web.php

Route::post('/auth/login', array('uses' => 'Auth\LoginController@postLogin'))->name('login');
Route::get('/landing', array('uses' => 'IndexController@landing'))->name('landing');

login.blade.php

<head>
    <meta charset = "utf-8" />
    <title>{{ config('app.name') }} ({{ config('app.env') }})</title>
    <meta name = "description" content = "Latest updates and statistic charts">
    <meta name = "viewport" content = "width=device-width, initial-scale=1, maximum-scale=1, shrink-to-fit=no">
    <meta name = "csrf-token" content = "{{ csrf_token() }}">
    <!-- 
    Global css & js here
    -->
</head>
<body>
    <form class = "m-login__form m-form" method = "post" action = "{{ route('login') }}">
        @csrf
        <!--
        Form content here
        -->
    </form>

    <!--begin::Page Scripts -->
    <script type = "text/javascript">
        var form_action = '{{ route('login') }}';
    </script>
    <script src = "{{ URL::asset('login.js')}}" type = "text/javascript"></script>
    <!--end::Page Scripts -->
</body>

login.js

var handleSignInFormSubmit = function() {
    $('#m_login_signin_submit').click(function(e) {
        e.preventDefault();
        var btn = $(this);
        var form = $(this).closest('form');

        form.validate({
            rules: {
                email: {
                    required: true,
                    email: true
                },
                password: {
                    required: true
                }
            }
        });

        if (!form.valid()) {
            return;
        }

        btn.addClass('m-loader m-loader--right m-loader--light').attr('disabled', true);

        var formData = form.serialize();
        $.ajax({
            url:form_action,
            type:'POST',
            data: formData,
            headers:{
                'X-CSRF-TOKEN': $('meta[name = "csrf-token"]').attr('content')
            },
            dataType: 'json',
            success:function(data){
                if (data.auth){
                    $(location).attr('href', data.intended);
                }
                else{
                    btn.removeClass('m-loader m-loader--right m-loader--light').attr('disabled', false);
                    showErrorMsg(form, 'danger', 'Incorrect username or password. Please try again.');
                }
            },
            error: function (data) {
                btn.removeClass('m-loader m-loader--right m-loader--light').attr('disabled', false);
                showErrorMsg(form, 'danger', 'Incorrect username or password. Please try again.');
            }
        });
    });
}

Аут \ Логинконтроллер

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\URL;
use Response;

class LoginController extends Controller
{
    use AuthenticatesUsers;

    protected $redirectTo = '/landing';

    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }

    public function postLogin(Request $request) {
        $auth = false;
        $credentials = $request->only('email', 'password', 'remember_token');

        if (Auth::attempt($credentials, $request->has('remember_token'))) {
            $auth = true; // Success
        }

        if ($auth){
            if ($request->ajax()){
                $response = array(
                    'auth' => true,
                    'code' => 101,
                    'intended' => URL::route('landing')
                );
            }
            else{
                $response = array(
                    'auth' => true,
                    'code' => 102,
                    'intended' => URL::route('landing')
                );
            }
            return Response::json($response);
        }
        else{
            $response = array(
                'status' => 'error',
                'msg' => 'Error',
            );
            return Response::json($response);
        }
    }
}

Часть ошибки ответа

message: "", exception: "Symfony\Component\HttpKernel\Exception\HttpException",…}
exception: "Symfony\Component\HttpKernel\Exception\HttpException"
file: "/var/www/imas/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php"
line: 204
message: ""

ОБНОВЛЕНО: Я поместил все в один файл php, поместил мета csrf-token в head + ajaxsetup в script, все еще получая код состояния 419 (Примечание: "test123" - это метод публикации в файле маршрута)

<!DOCTYPE html>
<html lang = "en">

    <!-- begin::Head -->
    <head>
        <meta charset = "utf-8" />
        <title>{{ config('app.name') }} ({{ config('app.env') }})</title>
        <meta name = "description" content = "Latest updates and statistic charts">
        <meta name = "viewport" content = "width=device-width, initial-scale=1, maximum-scale=1, shrink-to-fit=no">
        <meta name = "csrf-token" content = "{{ csrf_token() }}">


        <!--begin::Web font -->
        <script src = "https://ajax.googleapis.com/ajax/libs/webfont/1.6.16/webfont.js"></script>
        <script>
            WebFont.load({
            google: {"families":["Poppins:300,400,500,600,700","Roboto:300,400,500,600,700"]},
            active: function() {
                sessionStorage.fonts = true;
            }
          });
        </script>

        <!--end::Web font -->

        <!--begin:: Global Mandatory Vendors -->    
        <!--end:: Global Mandatory Vendors -->

        <!--begin:: Global Optional Vendors -->
        <!--end:: Global Optional Vendors -->

        <!--begin::Global Theme Styles -->
        <!--end::Global Theme Styles -->

        <!--begin::Page Vendors Styles -->
        <!--end::Page Vendors Styles -->

        <!--begin:: Custom CSS -->
        @yield('pagespecificstyles')
        <!--end:: Custom CSS -->
    </head>
    <!-- end::Head -->

    <!-- begin::Body -->
    <body class = "m-page--fluid m--skin- m-content--skin-light2 m-header--fixed m-header--fixed-mobile m-aside-left--enabled m-aside-left--skin-light m-aside-left--fixed m-aside-left--offcanvas m-footer--push m-aside--offcanvas-default">

        <!-- begin:: Page -->
        <div class = "m-grid m-grid--hor m-grid--root m-page">

            <!-- BEGIN: Header -->
            @include('admin.top')
            <!-- END: Header -->

            <!-- begin::Body -->
            <div class = "m-grid__item m-grid__item--fluid m-grid m-grid--ver-desktop m-grid--desktop m-body">

                <!-- BEGIN: Left Aside -->
                @include('admin.sidenav')
                <!-- END: Left Aside -->

                <div class = "m-grid__item m-grid__item--fluid m-wrapper">
                    <form name = "form1" id = "form1">
                    Name: <input type = "name" name = "username" id = "username"/><br/>
                    Password: <input type = "password" name = "password" id = "password"/><br/>
                    <input type = "button" value = "Submit" name = "btn_submit" id = "btn_submit"/>
                    </form>             
                </div>
            </div>

            <!-- end:: Body -->

            <!-- begin::Footer -->
            @include('admin.footer')
            <!-- end::Footer -->
        </div>

        <!-- end:: Page -->

        <!-- begin::Scroll Top -->      
        @include('admin.scrolltop')
        <!-- end::Scroll Top -->

        <!-- begin:: Script -->
        @include('admin.script')
        @yield('pagespecificscripts')
        <script>
        var formPath = '{{ route('test123') }}';
        $(document).ready(function(){
            $.ajaxSetup({
                headers: {
                    'X-CSRF-TOKEN': $('meta[name = "csrf-token"]').attr('content')
                }
            });

            $('#btn_submit').click(function(){

            var formData = $('#form1').serialize();
                $.ajax({
                    type:'POST',
                    url:formPath,
                    data:formData,
                    success:function(data){
                        alert(data);
                    }
                });
            });
        });
        </script>
        <!-- end:: Script -->
    </body>

    <!-- end::Body -->
</html>

Есть ли на вашем маршруте промежуточное ПО web?

SteD 18.12.2018 04:52

добавлено "-> middleware ('web')" после "-> name ('xxxx')", не повезло

xpluseddie 18.12.2018 05:00

Хм, не уверен, влияет ли это, но попробуйте удалить один из токенов csrf, вы передаете 2, один из <form> и один в headers ajax

SteD 18.12.2018 05:56
stackoverflow.com/questions/46266553/…
Bugfixer 18.12.2018 06:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
4
2 116
1

Ответы 1

Используйте это в заголовочном разделе HTML:

<head>
    <meta name = "csrf-token" content = "{{ csrf_token() }}" />
</head>

И в вашем ajax он используется в данных:

<script>
    $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': jQuery('meta[name = "csrf-token"]').attr('content') } });
</script>

Пожалуйста, обратитесь к документации Laravel CSRF защита

Метатег уже находится в заголовке login.blade. Может быть, проблема в том, что сценарий jquer / js был разделен в другом файле .js? (потому что я пробовал $ .ajaxSetup в файле .js и не помог)

xpluseddie 18.12.2018 07:10

Другие вопросы по теме