将Sanctum与常规Laravel身份验证一起使用

时间:2020-04-14 12:06:59

标签: laravel laravel-sanctum

我有一个简单的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。如果将“引荐来源网址”更改为“托管”,它将起作用。这可以接受吗?它是否仍然满足功能要点,即“给出的请求是来自第一方应用程序前端”,还是存在我未考虑过的安全隐患?

2 个答案:

答案 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 添加变量来指定您自己的引用。