Laravel 5.3 Ajax登录

时间:2016-09-24 11:46:38

标签: jquery ajax laravel-5 laravel-5.3

我正在尝试使用带有新Laravel 5.3项目的ajax登录我的用户。

我已经生成了auth路由,这些路由已添加到我的web.php中:

Auth::routes();

我有一个带有电子邮件,密码输入和csrf字段的html表单。然后我也有这个javascript文件:

$("form.login").submit(function(e) {
    e.preventDefault();

    $.ajax({   
        method: "POST",
        dataType: "json",
        headers: { 
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'),
        },
        data: $("form.login").serialize(),
        url: "/login"
    })
    .done(function(data) {
        console.log(data);
    });
});

但是当我发布时,它显示在我的网络标签中: chrome dev tools

重定向回原始页面,不返回任何数据。

为什么这样做? 5.3不再给json回复吗?

2 个答案:

答案 0 :(得分:5)

完整解决方案:

Hi reinierkors,

我也尝试用5.3版本做同样的事情,我终于解决了它:)解决方案非常干净。

首先,我 App \ Http \ Controllers \ Api 下创建了一个名为 Auth 的新文件夹,我这样做只是为了添加新的身份验证api的控制器所以我可以重写一些函数,然后我将auth控制器( LoginController ForgotPasswordController RegisterController )复制到这个新文件夹。

在LoginController类中: 我重写了重定向的函数。

  

第一个功能:会自动调用   认证返回成功。

     

第二个功能:会自动调用   验证返回错误。

     

当用户访问时,将自动调用最后一个函数   尝试5次登录尝试后锁定。

     /**
     * Send the response after the user was authenticated.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    protected function sendLoginResponse(Request $request) {
        $this->clearLoginAttempts($request);

        return response()->json(['SUCCESS' => 'AUTHENTICATED'], 200);
    }

    /**
     * Get the failed login response instance.
     *
     * @return \Illuminate\Http\Response
     */
    protected function sendFailedLoginResponse() {
        return response()->json(['ERROR' => 'AUTH_FAILED'], 401);
    }

    /**
     * Error after determining they are locked out.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    protected function sendLockoutResponse(Request $request) {
        $seconds = $this->limiter()->availableIn(
            $this->throttleKey($request)
        );

        return response()->json(['ERROR' => 'TOO_MANY_ATTEMPTS', 'WAIT' => $seconds], 401);
    }

在RegisterController类中: 我重写了重定向的函数。

  

在第一个函数中:我修改了验证器响应以返回一个更舒适的响应(数组)来处理。

     

注册返回成功时,将自动调用第二个函数

    /**
     * Handle a registration request for the application.
     *
     * @param Request $request
     * @return \Illuminate\Http\Response
     */
    public function register(Request $request) {
        $validator = $this->validator($request->all());

        if($validator->fails())
            return response()->json(['ERROR' => $validator->errors()->getMessages()], 422);

        event(new Registered($user = $this->create($request->all())));

        $this->guard()->login($user);

        return $this->registered($request, $user)
            ?: redirect($this->redirectPath());
    }

    /**
     * The user has been registered.
     *
     * @param Request $request
     * @param  mixed $user
     * @return mixed
     */
    protected function registered(Request $request, $user) {
        return response()->json(['SUCCESS' => 'AUTHENTICATED']);
    }

在ForgotPasswordController类中: 我重写了正在进行重定向的功能。

  

我修改了重置链接电子邮件功能,以便我们可以获取消息并显示为json而不是重定向。

     /**
     * Send a reset link to the given user.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\RedirectResponse
     */
    public function sendResetLinkEmail(Request $request)
    {
        $validator = Validator::make($request->only('email'), [
            'email' => 'required|email',
        ]);

        if ($validator->fails())
            return response()->json(['ERROR' => 'VALID_EMAIL_REQUIRED'], 422);

        // We will send the password reset link to this user. Once we have attempted
        // to send the link, we will examine the response then see the message we
        // need to show to the user. Finally, we'll send out a proper response.
        $response = $this->broker()->sendResetLink(
            $request->only('email')
        );

        if ($response === Password::RESET_LINK_SENT) {
            return response()->json(['SUCCESS' => 'EMAIL_SENT'], 200);
        }

        // If an error was returned by the password broker, we will get this message
        // translated so we can notify a user of the problem. We'll redirect back
        // to where the users came from so they can attempt this process again.
        return response()->json(['ERROR' => 'EMAIL_NOT_FOUND'], 401);
    }

答案 1 :(得分:1)

  

有关我的错误(与op相同的类型)的说明,请参阅edit history of this post

我是如何解决的

来自@iSensical

的一些帮助

app/Exceptions/Handler.php内部有一个unauthenticated函数,默认情况下,该函数会知道请求是否需要使用json函数的expectsJson()答案。

问题并非来自Laravel本身。令人惊讶的是,它是人为因素。我写了一段糟糕的代码。

我的ajax请求没有使用Laravel的直观标题。

我有这个:

$http({
    url     : '{{ route('angular.auth.login.post') }}',
    method  : 'POST',
    data    : $.param($scope.user)+'&x-csrf-token='+CSRF_TOKEN,
    headers : { 'Content-Type': 'application/x-www-form-urlencoded' }
})
[...]

我们可能使用了错误的Content-Type。 正确的是application/json,如下所示:

headers : { 'Content-Type': 'application/json' }