Laravel通过ajax登录维护会话

Posted

技术标签:

【中文标题】Laravel通过ajax登录维护会话【英文标题】:Laravel maintain a session through ajax login 【发布时间】:2016-11-04 20:27:25 【问题描述】:

我如何能够通过 Ajax 登录来维护或创建会话。我的 Laravel 安装与基本的 make:auth 安装没有太大区别。

我不得不重写 authcontroller 的某些部分来返回 json 而不是重定向。这是登录部分:

/**
 * Handle an authentication attempt.
 *
 * @return Response
 */
public function login(Request $request)

    $this->validate($request, [
        $this->loginUsername() => 'required',
        'password' => 'required'
    ]);

    // If the class is using the ThrottlesLogins trait, we can automatically throttle
    // the login attempts for this application. We'll key this by the username and
    // the IP address of the client making these requests into this application.
    $throttles = $this->isUsingThrottlesLoginsTrait();

    if ($throttles && $this->hasTooManyLoginAttempts($request)) 
        // to many attempts
        if ( $request->ajax() )
        
            $this->response['code'] = 406;
            $this->response['message'] = $this->sendLockoutResponse($request);

            return response()->json($this->response);
        

        return $this->sendLockoutResponse($request);
    

    $credentials = $this->getCredentials($request);
    $credentials['is_active'] = 1;

    if (Auth::attempt($credentials, $request->has('remember'))) 
        // succes
        return $this->handleUserWasAuthenticated($request, $throttles);
    

    // If the login attempt was unsuccessful we will increment the number of attempts
    // to login and redirect the user back to the login form. Of course, when this
    // user surpasses their maximum number of attempts they will get locked out.
    if ($throttles) 
        $this->incrementLoginAttempts($request);
    

    // error
    if ( $request->ajax() )
    
        $this->response['code'] = 406;
        $this->response['message'] = $this->getFailedLoginMessage();

        return response()->json($this->response);
    

    return redirect()->back()
        ->withInput($request->only($this->loginUsername(), 'remember'))
        ->withErrors([
            $this->loginUsername() => $this->getFailedLoginMessage()
        ]);


/**
 * Handle an authenticated response.
 *
 * @return Response
 */
public function authenticated($request, $user)

    if ( $request->ajax() )
    
        $this->response['message'] = "success";

        return response()->json($this->response);
    
    else
    
        return redirect()->intended($this->redirectPath());
    

以下是使用的路线:

Route::group(['namespace' => 'Auth'], function() 
    Route::post('/login', ['uses' => 'AuthController@login', 'as' => 'login']);
    Route::post('/registreer', ['uses' => 'AuthController@postRegister', 'as' => 'register']);
    Route::post('/reset', ['uses' => 'PasswordController@sendResetLinkEmail', 'as' => 'reset']);
);

我在前端使用 Vue.js,它会完美地得到错误并成功响应。只有在刷新浏览器后,我才处于登录状态。我怎么能做到这一点。

【问题讨论】:

你在构建 REST Api 吗? 你应该考虑使用Tokens而不是设置Session,看看JWT Auth github.com/tymondesigns/jwt-auth 不,我不是在构建 REST Api。我想用 ajax 创建一个登录表单,它增加了一个很好的 ui 感觉。例如,就像来自 airbnb 的模态登录。 这有点棘手。请参阅laravel.io answer,希望这会对您有所帮助。 【参考方案1】:

使用 AJAX/JSON REST API 时没有会话。 REST API 不使用会话,而是使用令牌/某种身份验证。

如果您正在构建 REST API 并使用 VueJS 作为单页应用程序的前端框架,请使用 api 中间件而不是默认的 web 中间件。

在此处阅读有关 JSON Web 令牌的更多信息: https://jwt.io/introduction/

【讨论】:

【参考方案2】:

当您使用 Ajax 时,您基本上是在创建一个无状态应用程序。前端基本上不需要知道用户的状态,不管他是否已经登录。所以你不需要任何会话。

您需要做的是从服务器获取信息,无论您的用户是否有权获取服务器上的任何资源。这基本上是 Authenticating(验证发送到服务器的用户凭据,然后向用户返回某种 id 的过程)和 Authorization 过程以检查 id 是否被授权访问所请求的资源。

【讨论】:

【参考方案3】:

我想我因为误解而没有正确地宣布我的问题。但是我确实让它工作了。解决方法是在特定路由周围放置中间件。现在我要通过 Ajax 请求登录。

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

【讨论】:

以上是关于Laravel通过ajax登录维护会话的主要内容,如果未能解决你的问题,请参考以下文章

会话超时后的 laravel csrf 令牌不匹配异常

尝试通过 AJAX 验证 Laravel 表单时出现错误 422

是否可以使用 API 令牌在 laravel 中进行用户模拟?

Laravel 和 WordPress 前端

Larave中CSRF攻击

Laravel 登录会话