【问题标题】:Laravel auth()->guard() returns null using vue jsLaravel auth()->guard() 使用 vue js 返回 null
【发布时间】:2019-07-29 02:03:52
【问题描述】:

我在 vue.js 中有一个登录表单。我只需要使用 vue.js 和 laravel 登录用户。登录后,用户将重定向到仅使用 laravel 开发的仪表板。我正在尝试登录,但它不起作用,auth()->guard 返回 null 以便用户重定向到登录页面而不是仪表板。当我在这种情况下使用邮递员时,效果很好。

Vue js

this.$http.post('http://localhost/project/admin/vendors/validate_login',{phone_number : this.phone_number},{
  headers: {
    "Access-Control-Allow-Origin": "*"
  }
})
.then((response) =>{
  if(response.data.status == 'success')
  {
    window.location = "http://localhost/project/admin/vendors/dashboard";
  }
})    

Laravel - 验证登录:

public function validate_login(Request $request)
{
    $arr_rules      = array();
    $status         = false;

    $remember_me               = "";
    $arr_rules['phone_number'] = "required";
    $validator = validator::make($request->all(),$arr_rules);
    if($validator->fails()) 
    {
         return response()->json([
                'status' => 'error',
                'msg' => "Mobile number is empty"
         ]);
    }
    $obj_group_vendor  = $this->UsersModel
                         ->where('phone_number',$request->only('phone_number'))
                         ->first();
    if($obj_group_vendor) 
    {
        if($this->auth->attempt(['phone_number' => $request->phone_number,
                                 'role_id'      => 3]))
        {
            return response()->json([
                'status' => 'success',
                'msg' => "You are successfully login to your account."
            ]);
        }
        else
        {
            return response()->json([
                'status' => 'error',
                'msg' => "Invalid login credential."
            ]);
        }
    }
    else
    {
        return response()->json([
            'status' => 'error',
            'msg' => "Invalid login credentials."
        ]);
    }
    return;
}       

路线:

$web_vendor_path = config('app.project.vendor_panel_slug');
Route::group(array('prefix'    => $web_vendor_path,
                   'middleware'=> ['vendor_auth_check']), function ()
{
    $route_slug = 'vendor_';
    Route::post('validate_login', ['as'   => $route_slug.'validate', 
                                   'uses' => $module_controller.'validate_login']);
});

Route::group(array('prefix'    => $web_vendor_path,
                   'middleware'=>'auth_vendor'), function () 
use($web_vendor_path)
{
    $route_slug        = 'vendor_';
    $module_controller = "Vendor\DashboardController@";
    Route::get('/dashboard',['as'   => $route_slug.'index', 
                             'uses' => $module_controller.'index']);
});

任何帮助将不胜感激。

【问题讨论】:

  • 为什么不使用 laravel 护照?如果您不想使用 laravel 护照,请使用 laravel 默认登录方法
  • @bhavinjr 实际上我已经完成了仪表板的所有功能。这是我必须使用 vue js 的唯一更改
  • 需要检查的几件事: 1. 检查您是否启用了会话。默认 Laravel 身份验证需要它。 2. 检查您的用户表是否有标准 id 字段,或者您在模型中为用户 id 标识 $primaryKey 字段。
  • 你能出示一下你的路由器吗?另外,你能检查一下回调中的响应是什么吗?谢谢
  • @punk73 我已经更新了我的问题。它返回 null。

标签: php laravel vue.js axios


【解决方案1】:

只是在这里吐出一些想法:

  • 尝试为所有 POST 请求设置 'Content-Type': 'application/x-www-form-urlencoded' 标头。

  • 此外,Access-Control-Allow-Origin 是一个应该在网络服务器的响应中的标头。它不是您应该在 javascript 请求中发送的标头。

【讨论】:

    【解决方案2】:

    确保您在 app/Providers/RouteServiceProvider.php

    中的路由文件中启用了 Web 中间件

    然后在 app/Http/Kernel.php 中检查 \Illuminate\Session\Middleware\StartSession::class,在 $middlewareGroups['web'] 中添加并启用

    【讨论】:

    • 是的,这两件事都和你说的一样,但还是不行。
    【解决方案3】:

    从浏览器发出 POST/PATCH/PUT/DELETE 请求时,您需要包含页面的 CSRF 令牌。

    this.$http.post('http://localhost/project/admin/vendors/validate_login',{phone_number : this.phone_number},{
      headers: {
        "Access-Control-Allow-Origin": "*",
        "X-CSRF-TOKEN": document.head.querySelector('meta[name="csrf-token"]').content
      }
    })
    .then((response) =>{
      if(response.data.status == 'success')
      {
        window.location = "http://localhost/project/admin/vendors/dashboard";
      }
    }) 
    

    并确保在所有页面中都包含 CSRF 作为元标记:

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

    【讨论】:

    • 我已禁用此路由以使用我们的 csrf 令牌。所以不需要传递 csrf 令牌
    【解决方案4】:

    如果您使用 api 保护,请执行此操作auth()-&gt;guard('api')

    【讨论】:

      猜你喜欢
      • 2016-07-30
      • 2019-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      • 2017-03-17
      • 2023-02-04
      相关资源
      最近更新 更多