使用具有常规 Laravel 身份验证的 Sanctum

Using Sanctum with regular Laravel authentication

我有一个简单的网络应用程序,对我的所有网络路由使用常规身份验证。我的应用程序中只有几个地方我希望能够从 Javascript 调用一些 API 路由。我可以设置 Sanctum 的 SPA 身份验证而无需进行 SPA 式登录吗?

我已按照服务器端的说明进行操作,在我的登录页面上,我在用户使用标准路由登录之前使用 axios 库执行 CSRF cookie 请求。但是当我尝试访问 Sanctum 保护的路由时,我只是被重定向到主页。

Sanctum 基于会话的身份验证是否应该与常规应用程序登录一起使用?

编辑

我找到问题了。在 EnsureFrontendRequestsAreStateful 中是这个函数:

public static function fromFrontend($request)
{
    $referer = Str::replaceFirst('https://', '', $request->headers->get('referer'));

    $referer = Str::replaceFirst('http://', '', $referer);

    return Str::startsWith($referer, config('sanctum.stateful', [])) ||
           Str::is(config('sanctum.stateful', []), $referer);
}

$referer 在我的请求中为空,因此此函数不能 return 为真。如果将 'referer' 更改为 'host' 它会起作用。这是可以接受的吗?它是否仍然满足函数的要点,即 "given request is from the first-party application frontend" 或者是否存在我没​​有考虑过的安全隐患?

'Referer' 在从 Javascript 命中 API 端点时有效,但是当从 Postman 或浏览器中命中它时 window headers non-existence 导致问题。因此,在简单的 GET 测试中,它重定向到登录,但在从 Vue 组件中的 Axios 库调用时工作正常。

'Referer' 也适用于邮递员,您只需要将 header 添加到您的请求 Referer -> {{host}}。托管它的邮递员变量,或者您可以像本地主机一样键入它。 Sanctum 默认检查这个 referer localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1,但是你可以通过在 env 文件中添加变量来指定你自己的 referer SANCTUM_STATEFUL_DOMAINS=your-app-domain.com 在这里。