Laravel 子域:所有子域的单一身份验证不起作用?

Posted

技术标签:

【中文标题】Laravel 子域:所有子域的单一身份验证不起作用?【英文标题】:Laravel subdomain: single auth across all subs not working? 【发布时间】:2020-09-28 17:23:48 【问题描述】:

我正在构建一个带有动态子域系统的站点,例如 (name.domain.com)。我正在使用带有 laravel 的 serve 命令的 Ubuntu。

我已经在我的路线中设置了所有这些:

Route::domain('x.localhost')->group(function ()
    Route::get('/url/',  'SomeController@someAction')->middleware('can:xyz,x')->name('someName');
);

现在,一切都很好,除了 Auth 被子域锁定

eg(xyz.localhost:8000/ , localhost:8000/) 需要单独登录。

经过一番谷歌搜索后,我可以在“域”下的 config/session.php 文件中覆盖它。因此,在我的 .env 文件中,我为 SESSION_DOMAIN 设置了一个新变量,并将其指向“.localhost”或“.localhost:800”,或者只是为了测试我得到与建议的 IP 127.0.0.1 / :8000 相同的结果,但是当我尝试登录我的会话在登录后立即无效,例如(我登录并被重定向到正确的路线,但我的身份验证发现我没有登录)

会话配置

'domain' => env('SESSION_DOMAIN', null),

我的 .env

SESSION_DOMAIN=.localhost

似乎由于某种原因没有设置 cookie?

应该注意这是同时使用文件和数据库进行会话的情况,我还每次都清除了我的缓存和会话存储以及 cookie 等。

-- 在过去的几天里,我已经尝试了所有我能想到的方法来解决这个问题,但没有成功。即使在全新安装的 laravel 上也存在同样的问题。

我可以在主 URL 上使用 FF 登录,但在子 URL 上我没有登录,如果我尝试会得到 419。

有什么建议吗?亲切的问候,马特

-编辑

要在新安装的 laravel 上重现,首先,安装 auth 包:

composer require laravel/ui

php artisan ui vue --auth
npm run dev

接下来,用你的 mysql 数据库信息编辑你的 .env 文件,并将这一行添加到文件中:

SESSION_DOMAIN=.localhost

最后将它添加到你的 web.php 路由文件中。

Route::domain('foobar.localhost')->group(function ()
    Route::get('/test/',  'HomeController@index');
);

(我喜欢在这里在命令行中创建一个帐户) 然后推送默认迁移并通过登录主页和任何子域来运行服务器和测试。

【问题讨论】:

这能回答你的问题吗? Auth::user() doesn't travel across subdomains? - Laravel 5.2 检查这个:***.com/a/34488988/7354094 不幸的是,我已经尝试过了,您可以在 SESSION_DOMAIN 下的 .env 中设置域值。这是有关会话的当前会话配置文件。 ``` '域' => env('SESSION_DOMAIN', null), ``` 【参考方案1】:

因为是 localhost 域,而是使用虚拟域,例如 something.test,然后设置 SESSION_DOMAIN=.something.test 并清除缓存。 localhost 和 127.0.0.1 不是同一来源,因此无法设置会话。

【讨论】:

您好 TEFO,感谢您的回复。请您详细说明一下好吗?我不确定我是否在关注你。当我测试时,我只使用 localhost,127.0.0.1 只是尝试看看它是否可以工作。我试图在我的主机文件中设置一个主机并将其指向 127.0.0.1:8000 但我遇到了同样的问题。亲切的问候。 对于设置会话(cookies),您需要确切的 url 来源,这意味着您不会访问在 127.0.0.1:8000 中设置在 localhost:8000 上的 cookie,并且对于 localhost 和 localhost:8000 也是如此。例如检查你机器上的 localhost 它可能是不同的项目。 嗨 TEFO,我很抱歉,我不确定我是否只是疯狂地不关注你,或者你误解了我的问题。如果是我自己的愚蠢,我很抱歉。我只为该站点使用一个域,我没有尝试通过不同的***域(例如 localhost:8000 和 127.0.01:8000)访问该站点,而是尝试仅通过 localhost:8000 等动态子域访问该站点,测试。本地主机:8000,foobar.localhost:8000。我将编辑我的原始帖子以获取重现步骤。 @Makka 在您的主机文件中,添加127.0.0.1 something.test127.0.0.1 foo.something.test,不要指定端口。然后按照@TEFO 所说设置SESSION_DOMAIN=.something.test,会话将在http://something.test:8000http://foo.something.test:8000 上持续存在【参考方案2】:

供您参考,有一个 cookie 和会话存储来持久化会话,laravel 还支持在数据库中持久化会话。会话 cookie 具有可访问的域,因此您需要配置 session.php 文件以采用子域。单一身份验证不适用于您的所有子域,因为您没有很好地配置它。这是你可以做到的。

您需要更新会话配置以在包括子域在内的域范围内保持会话。请按照以下步骤操作。

    首先设置要在应用程序中使用的虚拟主机。然后,您也可以将虚拟主机用于子域。现在您使用的是localhost,它根本不是域。它是 TCP/IP 模型中的环回地址。请参阅rfc2606 定义。

    转到 config/session.php 并将前缀为 .domain 更新为 config => '.your-domain.com'.

    然后清除您的应用程序缓存,打开 Chrome DevTool 并转到 应用程序 > 应用程序 > 清除存储。您还需要清除以前的 cookies

    运行 artisan 命令 php artisan config:cachephp artisan config:clear 以删除之前缓存的 laravel 应用程序配置。

如果您使用 database 作为会话驱动程序,您需要为此创建一个会话表。运行命令php artisan session:table生成会话表迁移,然后使用php artisan migrate进行迁移。然后执行上面给出的四个步骤。你可以参考我类似的回答,逻辑上和你关注的一样Here

【讨论】:

以上是关于Laravel 子域:所有子域的单一身份验证不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

通过多个 Laravel 5 安装跨子域共享身份验证会话

未经身份验证的 api laravel 子域

Firebase - 使用 firebase admin sdk 跨子域共享身份验证

如何跨子域进行身份验证

子域路由在 Laravel 5 上不起作用 - WAMPServer

Laravel 根路由“/”在子域的前缀路由中不起作用