Laravel Sanctum auth:带有Angular SPA的Sanctum中间件未经身份验证的响应

时间:2020-04-11 16:22:19

标签: php angular laravel laravel-sanctum

我有一个具有以下设置的应用程序:

Laravel

主机:appname.local:8000

环境变量:

  • SESSION_DRIVER =数据库
  • SESSION_LIFETIME = 480
  • SESSION_CONNECTION = mysql
  • SESSION_DOMAIN = .appname.local
  • SESSION_SECURE_COOKIE = false
  • SESSION_COOKIE = appnameapi_session
  • SANCTUM_STATEFUL_DOMAINS ='。appname.local,localhost,127.0.0.1'

角度

主机:appname.local:4200

当前有效的方法:

  • 我可以调用Sanctum的csrf-cookie端点,该端点在浏览器中设置CSRF令牌。
  • 然后,我可以使用Auth :: attempt()调用我的API的登录终结点,以在Laravel应用中对用户进行身份验证。这将在会话表中创建一个新条目,如下所示

获取令牌并验证用户身份的角度方法 Angular methods to get token and login

成功认证后的会话数据库条目 Session database entry after successful authentication

什么不起作用:

对由以下中间件保护的路由的后续请求: auth:sanctum 均导致未认证的响应。 HTTP请求永远不会到达我的控制器。

auth:圣所保护的路线 auth:sanctum protected routes

但是我可以在开发者控制台中看到正在发送cookie。所以我不明白为什么Sanctum没有拿起认证 enter image description here

我已经看了几本教程,但我似乎不明白为什么Laravel的Authenticate中间件无法看到我已经对用户进行了认证。

有人知道我在做什么错吗?

5 个答案:

答案 0 :(得分:3)

@ agm1984和@Eden Webstudio提供的答案非常有用。但是,他们没有解决我的问题。

经过额外的调试后,我注意到圣所的后卫逻辑在以下位置寻找后卫 config/sanctum.php。其默认值为 web 。我对受保护路由的默认防护是 api 防护,这是我在身份验证过程中使用的防护。 enter image description here

在config / sanctum.php中使用'api'设置了保护密钥后,身份验证似乎可以顺利进行。老实说,我不记得为什么我决定为我的api Guard选择会话驱动程序。

config / sanctum.php config/sanctum.php

config / auth.php

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.netproduct.hockeysticks.netservice.hockeysticks.netapi.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 的回答后设置了以下内容