我有一个简单的Web应用程序,它对我的所有Web路由都使用常规身份验证。我的应用程序中只有几个地方希望能够从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
在我的请求中为null,因此该函数无法返回true。如果将“引荐来源网址”更改为“托管”,它将起作用。这可以接受吗?它是否仍然满足功能要点,即“给出的请求是来自第一方应用程序前端”,还是存在我未考虑过的安全隐患?
答案 0 :(得分:0)
'Referer'在从Javascript中访问API终结点时有效,但是从Postman或在浏览器窗口中访问时,标题不存在会导致问题。因此,在简单的GET测试中,它可以重定向到登录,但是当从Vue组件中的Axios库调用时可以正常工作。
答案 1 :(得分:0)
'Referer' 也适用于邮递员,您只需要向您的请求 Referer -> {{host}} 添加标头。托管它是邮递员变量,或者您可以像本地主机一样键入它。 Sanctum 默认检查此引用 localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1,但您可以通过在此处向环境文件 SANCTUM_STATEFUL_DOMAINS=your-app-domain.com 添加变量来指定您自己的引用。