1

我有一个简单的网络应用程序,对我的所有网络路由使用常规身份验证。我的应用程序中只有几个地方我希望能够从 Javascript 调用一些 API 路由。我可以在不进行 SPA 样式登录的情况下设置 Sanctum 的 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在我的请求中为 null,因此此函数无法返回 true。如果将“referer”更改为“host”,它就可以工作。这可以接受吗?它是否仍然满足功能的要点,即“给定的请求来自第一方应用程序前端”还是我没有考虑到安全隐患?

4

2 回答 2

0

'Referer' 在从 Javascript 访问 API 端点时有效,但是从 Postman 或在浏览器窗口中访问它时,标头不存在会导致问题。因此,在简单的 GET 测试中,它会重定向到登录,但在从 Vue 组件中的 Axios 库调用时工作正常。

于 2020-04-15T19:59:40.157 回答
0

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

于 2021-02-20T11:57:32.260 回答