Laravel auth()->guard() 使用 vue js 返回 null

Posted

技术标签:

【中文标题】Laravel auth()->guard() 使用 vue js 返回 null【英文标题】:Laravel auth()->guard() returns null using vue js 【发布时间】: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。 【参考方案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')

【讨论】:

以上是关于Laravel auth()->guard() 使用 vue js 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 说 Auth guard [] 没有定义

Laravel auth登录之怎么通过guard流程

Laravel 5.2.29 multiauth 使用 Auth::guard('one'),Auth::guard('two')

Laravel 5.4 Tymon JWT Auth Guard 驱动未定义

Laravel 8 门不适用于 Auth::guard

Laravel中Auth:guard表示啥意思