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.test
和127.0.0.1 foo.something.test
,不要指定端口。然后按照@TEFO 所说设置SESSION_DOMAIN=.something.test
,会话将在http://something.test:8000
和http://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:cache
或 php artisan config:clear
以删除之前缓存的 laravel 应用程序配置。
如果您使用 database 作为会话驱动程序,您需要为此创建一个会话表。运行命令php artisan session:table
生成会话表迁移,然后使用php artisan migrate
进行迁移。然后执行上面给出的四个步骤。你可以参考我类似的回答,逻辑上和你关注的一样Here
【讨论】:
以上是关于Laravel 子域:所有子域的单一身份验证不起作用?的主要内容,如果未能解决你的问题,请参考以下文章
Firebase - 使用 firebase admin sdk 跨子域共享身份验证