我有一个具有以下设置的应用程序:
Laravel
主机:appname.local:8000
环境变量:
角度
主机:appname.local:4200
当前有效的方法:
什么不起作用:
对由以下中间件保护的路由的后续请求: auth:sanctum 均导致未认证的响应。 HTTP请求永远不会到达我的控制器。
但是我可以在开发者控制台中看到正在发送cookie。所以我不明白为什么Sanctum没有拿起认证
我已经看了几本教程,但我似乎不明白为什么Laravel的Authenticate中间件无法看到我已经对用户进行了认证。
有人知道我在做什么错吗?
答案 0 :(得分:3)
@ agm1984和@Eden Webstudio提供的答案非常有用。但是,他们没有解决我的问题。
经过额外的调试后,我注意到圣所的后卫逻辑在以下位置寻找后卫
config/sanctum.php
。其默认值为 web 。我对受保护路由的默认防护是 api 防护,这是我在身份验证过程中使用的防护。
在config / sanctum.php中使用'api'设置了保护密钥后,身份验证似乎可以顺利进行。老实说,我不记得为什么我决定为我的api Guard选择会话驱动程序。
config / auth.php
答案 1 :(得分:2)
Laravel Sanctum似乎不支持SPA的通配符域。
尝试删除点。
SANCTUM_STATEFUL_DOMAINS='appname.local'
对于通配符子域,您可能需要其他解决方案。您可以查看承载令牌选项。我还没有测试过。
答案 2 :(得分:2)
我认为伊甸园是正确的。我出于不相关的原因访问此问题,但是为了支持子域,您可以在SESSION_DOMAIN
env变量中添加一个点,但不能使用SANCTUM_STATEFUL_DOMAINS
。
这是本地和生产环境的有效env配置:
./。env
# localhost
SANCTUM_STATEFUL_DOMAINS="angular-site.test"
SESSION_DOMAIN=".angular-site.test"
# production
# SANCTUM_STATEFUL_DOMAINS="hockeysticks.net"
# SESSION_DOMAIN=".hockeysticks.net"
这将使Cookie可以跨多个子域工作,例如auth.hockeysticks.net
,product.hockeysticks.net
,service.hockeysticks.net
和api.hockeysticks.net
。
如果某人将点放在SESSION_DOMAIN
中,则在没有子域的情况下cookie仍然可以使用,但是在这种情况下,从理论上讲,忽略它应该更为安全。
这是Laravel的开发人员Mohamed Said的视频,其中谈论了《圣殿》:https://www.youtube.com/watch?v=Kd3hcrxtTHA。在其中,他介绍了身份验证逻辑。
答案 3 :(得分:0)
我有同样的问题。我发现,如果请求是通过未在端口号上设置的应用程序发出的,那么sanctum SPA API可以正常工作。
您可以在上托管您的前端应用程序
appname.local
代替appname.local:4200
答案 4 :(得分:0)
如果您将 localhost 用于前端和后端,并使用不同的端口,如下所示:
角度/离子
<块引用>主机:本地主机:8100
Laravel v8
<块引用>主机:本地主机:8000
尝试将您的 ./env 设置为:
SESSION_DOMAIN=localhost
SANCTUM_STATEFUL_DOMAINS=localhost:8100
请记住,我在遵循@Gloire 的回答后设置了以下内容