4

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

拉拉维尔

主机:appname.local:8000

环境变量:

  • SESSION_DRIVER=数据库
  • 会话寿命=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 令牌。
  • 然后我可以调用我的 API 的登录端点来使用 Auth::attempt() 在我的 Laravel 应用程序中对用户进行身份验证。这会在会话表中创建一个新条目,如下所示

获取令牌和验证用户的 Angular 方法 获取令牌和登录的角度方法

认证成功后的会话数据库入口 认证成功后的会话数据库入口

什么不起作用:

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

auth:sanctum 保护路线 auth:sanctum 保护路线

但我可以在开发者控制台中看到正在发送 cookie。所以我不明白为什么 Sanctum 不接受身份验证 在此处输入图像描述

我已经学习了几个教程,但我似乎无法理解为什么 Laravel 的 Authenticate 中间件无法看到我已经对我的用户进行了身份验证。

有谁知道我可能做错了什么?

4

5 回答 5

5

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

经过额外的调试,我注意到 sanctum 的守卫逻辑在 config/sanctum.php. 它的默认值为web。我对受保护路由的默认保护是api保护,它是我在身份验证过程中使用的保护。 在此处输入图像描述

使用“api”在 config/sanctum.php 中设置保护密钥后,身份验证似乎工作顺利。老实说,我不记得为什么我决定为我的 api 守卫使用会话驱动程序。

配置/sanctum.php 配置/sanctum.php

配置/auth.php

配置/auth.php

于 2020-06-07T18:32:18.207 回答
3

Laravel Sanctum 似乎不支持 SPA 的通配符域。

尝试删除点。

SANCTUM_STATEFUL_DOMAINS='appname.local'

对于通配符子域,您可能需要不同的解决方案。您可以查看不记名令牌选项。我还没有测试过这个。

于 2020-06-03T14:59:46.063 回答
2

我认为伊甸园是正确的。我出于不相关的原因访问这个问题,但是为了支持子域,你可以在SESSION_DOMAINenv 变量中有一个点,但从不SANCTUM_STATEFUL_DOMAINS

这是本地和生产的有效环境配置:

./.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 的一段视频,谈论 Sanctum:https ://www.youtube.com/watch?v=Kd3hcrxtTHA 。在其中,他介绍了身份验证逻辑。

于 2020-06-05T16:19:27.343 回答
0

我遇到过同样的问题。如果请求来自未在端口号上设置的应用程序,我发现 sanctum SPA API 工作正常。

您可以将您的前端应用程序托管在

appname.local

而不是 appname.local:4200

于 2020-06-22T14:16:12.650 回答
0

如果您使用 localhost 作为前端和后端的不同端口,如下所示:

角/离子

主机:本地主机:8100

Laravel v8

主机:本地主机:8000

尝试将您的./env设置为:

SESSION_DOMAIN=localhost
SANCTUM_STATEFUL_DOMAINS=localhost:8100

请记住,我在遵循@Gloire 的回答后设置了以下内容

于 2020-12-23T12:52:23.950 回答