【问题标题】:Laravel share session across domainLaravel 跨域共享会话
【发布时间】:2020-07-23 19:56:54
【问题描述】:

我目前正在开发一个托管在域上的 laravel 项目。此应用程序的一部分(某些功能)必须位于不同的域中。我找到了一种方法,在我的 web.php 中,我用 :

映射了所有路线
Route::group(['domain' => config('app.main_domain')], function () {

以及需要以相同方式位于另一个域上的路由,但具有不同的域。行。 在主域中,我创建了一个带有 src 属性的图像:

<img src="{{ config('second_domain') . DIRECTORY_SEPARATOR }}auth?id={{ \Illuminate\Support\Facades\Crypt::encrypt(\Illuminate\Support\Facades\Session::getId()) }}" style="display:none;"/>

指向这个方法路由:

  if ($request->has('id')) {

            $session_id = Crypt::decrypt($request->get('id'));
            Session::setId($session_id);
            Session::start();
        }

它正在工作。我在不同的域上共享相同的会话,但是,我想问你们是否知道这种情况下的更好方法。我知道这是 google 使用的旧方法。

我不得不说,用户需要在不同的域中保持身份验证。我查看了 laravel 护照或 laravel sanctum,但这些都是用于 API 身份验证的。

我们将不胜感激。

【问题讨论】:

  • 请看这个,这篇文章中讨论的所有场景stackoverflow.com/questions/14611545/…
  • 感谢您的回复,但这是一个非常古老的线程,我阅读了它,但没有找到任何对我有帮助的东西..
  • 当用户登录网站时,将用户重定向到具有会话ID/一些令牌的其他网站页面,其他网站可以读取会话ID/令牌,验证令牌/ID,如果有效则设置cokkie并重定向回到您最初希望用户登录后去的任何地方。在此处查看接受的答案stackoverflow.com/questions/6761415/…
  • 在用户登录后将用户重定向到另一个页面,然后返回原始网站,这有点糟糕。我不知道 oauth2 是否会帮助我或大量请求
  • 但是 google 所做的,它重定向的时间很短而且速度很快,你甚至都不会注意到。您可以尝试将令牌存储在本地存储中,其他网站可以获取该令牌

标签: php laravel laravel-6


【解决方案1】:

对于不同域的登录,您应该描述不同的“守卫”。


配置

例如config/auth.php

'defaults' => [
    'guard' => 'web', // or 'admin'
    'passwords' => 'users',
],
'guards' => [
    'admin' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'web' => [
        'driver' => 'session',
        'provider' => 'tourists',
    ],

    'api' => [
        'driver' => 'token',
        'provider' => 'users',
        'hash' => false,
    ],
],

我在我的项目中使用了两个守卫:

  • 第一个是'admin',用于管理面板,我用作提供者 User.php 模型。

  • 第二个是'web',用于前端或公共站点,使用 Tourist.php 模型,但也可以使用 User 模型。


控制器

您可以在管理面板的 LoginController 中使用特定的守卫:

protected function guard()
{
    return Auth::guard('admin');
}

对于网站的一般域

protected function guard()
{
    return Auth::guard('web');
}

路线

最后你问我,我怎样才能保护我的路线,pff,简单地说:

Route::group(['middleware' => 'auth:web'], function () {
    Route::get('/', 'Cabinet\HomeController@index')->name('home');
});

或用于管理员私有路由

Route::group(['middleware' => 'auth:admin'], function () {
    Route::get('/', 'Admin\HomeController@index')->name('home');
});

阅读有关身份验证的更多信息https://laravel.com/docs/7.x/authentication#adding-custom-guards

【讨论】:

  • 不同守卫的目的是什么..?我认为我的问题很明确:我有一个在 dev.test 上运行的 Laravel 应用程序。这个应用程序的一部分,必须指向 dev.test2,一个不同的域,当你去 dev.test2 时,你没有会话
猜你喜欢
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 2016-08-01
  • 2021-01-25
  • 2011-06-11
  • 1970-01-01
相关资源
最近更新 更多