返回

Laravel Sanctum 401 错误:原因、解决方法和常见问题解答

vue.js

Laravel Sanctum 中的 401 未授权错误:深入解析与解决方法

问题

在将 Laravel Sanctum 与 Vuejs 单页面应用程序 (SPA) 集成时,授权失败是一个常见问题,表现为返回 401 未授权错误。本文将深入探讨导致此错误的原因,并提供一系列步骤来解决它。

解决步骤

1. CORS 配置

确保你的 .env 文件中设置了 SANCTUM_STATEFUL_DOMAINS,包含 SPA 的域名:

SANCTUM_STATEFUL_DOMAINS=app-spa.demo.localhost

2. CSRF 令牌

在 Vuejs 的 Axios 配置中,启用 withCredentials 选项并设置 CSRF 令牌:

// 在 VueJS 中
import axios from 'axios';

axios.defaults.withCredentials = true;
axios.defaults.xsrfCookieName = 'XSRF-TOKEN';
axios.defaults.xsrfHeaderName = 'X-XSRF-TOKEN';

3. 路由保护

在 Laravel 的 Api.php 路由文件中,添加 auth:sanctum 中间件以保护需要授权的端点:

Route::middleware(['auth:sanctum'])->group(function () {
    // 受保护的路由
});

4. Cookie 共享

确保 Laravel 和 SPA 都在使用相同的顶级域,并在 Laravel 的 .env 文件中设置 SESSION_DOMAIN

SESSION_DOMAIN=.demo.localhost

其他相关配置

1. CORS 配置

在 Laravel 的 cors.php 配置文件中,允许来自 SPA 域的跨域请求:

'allowed_origins' => ['*'],
'supports_credentials' => true,

2. 代码示例

以下代码段演示了如何设置 Axios 以使用 CSRF 令牌:

// 在 VueJS 中
import axios from 'axios';

axios.defaults.withCredentials = true;
axios.defaults.xsrfCookieName = 'XSRF-TOKEN';
axios.defaults.xsrfHeaderName = 'X-XSRF-TOKEN';

结论

通过遵循这些步骤,你应该能够解决 Laravel Sanctum 中的 401 未授权错误并成功授权你的 API 端点。请记住,这些配置可能会因你的特定应用程序而异,因此可能需要进行一些微调。

常见问题解答

1. 为什么我在授权后仍然收到 401 错误?
答:检查你的 CSRF 令牌是否正确设置,并确保你的 SPA 和 Laravel 应用程序使用相同的顶级域。

2. 如何启用 CORS?
答:在 Laravel 的 cors.php 配置文件中设置 allowed_originssupports_credentials

3. 如何在 Vuejs 中使用 Axios?
答:导入 axios,启用 withCredentials 并设置 CSRF 令牌。

4. 如何保护 Laravel 路由?
答:在 Api.php 路由文件中使用 auth:sanctum 中间件。

5. 为什么需要 CSRF 令牌?
答:CSRF 令牌用于防止跨站点请求伪造 (CSRF) 攻击,该攻击可以劫持用户的会话并以其名义执行操作。