使用 nuxtjs 登录 laravel sanctum 后出现 401(未验证)错误

Posted

技术标签:

【中文标题】使用 nuxtjs 登录 laravel sanctum 后出现 401(未验证)错误【英文标题】:Get 401(Unauthenticated) error after login on laravel sanctum with nuxtjs 【发布时间】:2021-09-16 20:00:15 【问题描述】:

我已经安装了:

laravel v 7.30.4 nuxtjs v 2.15.7

在我使用 nuxtjs auth 模块登录我的 laravel sanctum 后,当 nuxt 尝试获取用户时,laravel 响应 401 错误(未经身份验证的消息)。

我的网络状态:

我的 cookie 状态:

api.php:

    Route::group(['middleware'=>'auth:sanctum'], function ()
       Route::get('/user', function (Request $request)
          return $request->user();
       );
    );

nuxt.config.js

   auth:
    strategies: 
      'laravelSanctum': 
        provider: 'laravel/sanctum',
        url: 'http://localhost:8000',
        endpoints:
          login:
            url:'/login'
          ,
          logout:
            url:'/api/logout'
          ,
        ,
        user:
          property:false
        
      ,
    ,
    redirect:
      login: '/auth/login',
      logout:'/',
      home:'/'
    ,
    cookie: 
      options: 
        sameSite: 'lax'
      ,
    ,
  ,

LoginController.php

    public function login(Login $request)
    
        $user=User::where('phone_number', $request->phone_number)->first();
        if (Hash::check($request->password, $user->password))
            $request->session()->regenerate();
            return response()->json(null, 201);
        
        return $this->setStatusCode(422)->respondWithError('password','invalid pasword');
    

.env

SESSION_DRIVER=file
SESSION_LIFETIME=120
SESSION_DOMAIN=localhost

SANCTUM_STATEFUL_DOMAINS=localhost:3000

我不知道我得到 401 错误的问题在哪里!

【问题讨论】:

您能否通过 Postman 完成这项工作? 【参考方案1】:

我遇到了同样的问题,解决方法是将 localhost:8000(laravel 域)添加到 SANCTUM_STATEFUL_DOMAINS

SESSION_DOMAIN=localhost
SANCTUM_STATEFUL_DOMAINS=localhost:8000,localhost:3000

【讨论】:

【参考方案2】:

您需要在登录后返回您的api token。并在您在 laravel 路由中使用middleware('auth:sanctum') 的每个请求中发送它。

更多关于issuing tokens in sanctum的信息

获取用户需要token,如果没有提供它会抛出 401 错误。

【讨论】:

它不是 api 令牌认证,它是 spa 认证:laravel.com/docs/8.x/sanctum#spa-authentication【参考方案3】:

在你的 .env 中你可以添加这个 SESSION_SECURE_COOKIE=false

【讨论】:

【参考方案4】:

您是否已将 EnsureFrontendRequestsAreStateful 添加到应用程序的 app/Http/Kernel.php 文件中的 api 中间件组?

use Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful;

protected $middlewareGroups = [
  ...
  'api' => [
      EnsureFrontendRequestsAreStateful::class, // Add & import this class
      'throttle:60,1',
      \Illuminate\Routing\Middleware\SubstituteBindings::class,
  ],
];

如果您将 sanctum 与 SPA 应用程序一起使用,这是必要的。这已被记录为Installation

的一部分

还可以查看此部分,了解您遇到的问题是否与 CORS in Sanctum 相关

【讨论】:

我先做了 :) 我看到了文档并做了,但它没有用 您是否使用nuxt/auth 包。如果没有,您可以尝试使用它,看看是否可以解决问题? auth.nuxtjs.org/providers/laravel-sanctum 这是另一篇关于其用法的博文swapnil.dev/blog/authentication-in-nuxtjs-using-laravel-sanctum @OmidRezaHeidari,您是否已经接近解决问题或者您仍然收到 401 错误? 我收到 401 响应了! @OmidRezaHeidari 你有没有设法解决这个问题?

以上是关于使用 nuxtjs 登录 laravel sanctum 后出现 401(未验证)错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在 nuxtjs 中显示来自存储(Laravel)的图像

nuxt auth - 登录:假和用户:空

在 nuxtjs 中刷新页面后如何保持用户身份验证?

this.$auth.loggedIn 返回 false

@nuxtjs/auth 为啥刷新页面总是重定向到登录

带有 laravel sanctum 的 Nuxt 收到“未验证”消息