【问题标题】:Laravel Sanctum auth:sanctum middleware with Angular SPA unauthenticated responseLaravel Sanctum auth:sanctum 中间件,带有 Angular SPA 未经身份验证的响应
【发布时间】:2020-07-24 08:47:49
【问题描述】:

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

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

获取令牌和验证用户的 Angular 方法

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

什么不起作用:

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

auth:sanctum 保护路线

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

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

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

【问题讨论】:

  • 您是否仔细检查过所有设置是否正确,如SPA configuration 部分所示?
  • @DigitalDrifter 是的,我做到了。有状态配置采用我在问题中发布的环境变量“SANCTUM_STATEFUL_DOMAINS”的值。我将 sanctum 的中间件添加到 API 组,还按照文档中的建议完成了 CORS 和 Cookies 部分。
  • 嗨。你设法解决这个问题吗?我也面临同样的问题。
  • @EdenWebStudio 不。我决定现在使用基于正常会话的身份验证。我计划在完成一些任务后再试一次。
  • @EdenWebStudio 你解决了吗?我也被困在那里:(

标签: php angular laravel laravel-sanctum


【解决方案1】:

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

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

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

config/sanctum.php

config/auth.php

【讨论】:

    【解决方案2】:

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

    尝试删除点。

    SANCTUM_STATEFUL_DOMAINS='appname.local'
    

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

    【讨论】:

      【解决方案3】:

      我认为伊甸园是正确的。我出于不相关的原因访问此问题,但为了支持子域,您可以在 SESSION_DOMAIN 环境变量中添加一个点,但不能在 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。在其中,他遍历了身份验证逻辑。

      【讨论】:

        【解决方案4】:

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

        您可以在

        上托管您的前端应用程序

        appname.local

        而不是 appname.local:4200

        【讨论】:

          【解决方案5】:

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

          角度/离子

          主机:本地主机:8100

          Laravel v8

          主机:本地主机:8000

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

          SESSION_DOMAIN=localhost
          SANCTUM_STATEFUL_DOMAINS=localhost:8100
          

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

          【讨论】:

            猜你喜欢
            • 2021-07-17
            • 2023-03-10
            • 2020-12-14
            • 2021-07-22
            • 1970-01-01
            • 1970-01-01
            • 2021-05-24
            • 2023-03-21
            • 2020-09-09
            相关资源
            最近更新 更多