Session Laravel:在多个域上共享会话数据

Session Laravel:在多个域上共享会话数据,session,authentication,laravel,cross-domain,Session,Authentication,Laravel,Cross Domain,我正在Laravel中构建一个多域/多商店的电子商务应用程序,希望在用户从一个商店切换到另一个商店时保持登录状态 但据我所知,Laravel的身份验证服务将登录用户保存在会话中,其他域无法访问会话 有没有一种方法(可能是一个包)可以实现这一点,而不会让我的应用程序容易出现安全问题 提前谢谢 我也在开发类似的单点登录系统,仍在寻找解决方案,但这是一个开始 在laravel上,您可以将/app/config/session.php驱动程序更改为cookie 编辑: 这就是我所做的 您可以使用像素图

我正在Laravel中构建一个多域/多商店的电子商务应用程序,希望在用户从一个商店切换到另一个商店时保持登录状态

但据我所知,Laravel的身份验证服务将登录用户保存在会话中,其他域无法访问会话

有没有一种方法(可能是一个包)可以实现这一点,而不会让我的应用程序容易出现安全问题


提前谢谢

我也在开发类似的单点登录系统,仍在寻找解决方案,但这是一个开始

在laravel上,您可以将/app/config/session.php驱动程序更改为cookie


编辑:

这就是我所做的

您可以使用像素图像跨域共享cookie。 例如,当您登录domain1.com时,您希望在domain2.com上创建一个cookie,登录domain1.com后,您需要这样的东西

<img src="http://www.domain2.com/create-cookie?param=hash">

在domain2.com上,选择上面的路线:

  • 将首先检查用户是否已登录
  • 如果未登录,则将读取哈希(例如电子邮件地址),检查是否有用户使用该电子邮件,并在那里登录,同时设置cookie

  • 您可以手动设置会话cookie将注册到哪个域,从而使它们在不同站点间保持。只需在以下部分编辑
    config/session.php

    <?php
    /*
        |--------------------------------------------------------------------------
        | Session Cookie Domain
        |--------------------------------------------------------------------------
        |
        | Here you may change the domain of the cookie used to identify a session
        | in your application. This will determine which domains the cookie is
        | available to in your application. A sensible default has been set.
        |
        */
    
        'domain' => null,
    ?>
    
    
    
    不过,您仍然被限制在一个顶级域中。因此,您可以使用
    store1.shops.com
    store2.shops.com
    共享会话,但不能使用
    myshop.com
    shopsmart.com

    如果您需要这种格式的东西,那么通过创建身份验证服务,并使用访问令牌验证凭据,您可能会过得更好。您还可以查看类似的服务

  • 在域A中捕获会话id
    session::getId()
  • 通过HTTP POST将捕获的会话id发送到域B
  • 访问域B中发送的会话id
    $sessionid\u from\u domainA=$\u POST['session\u from\u A']
  • 在域B中设置会话
    session::setId($sessionid\u from\u domainA)
  • 在域B中启动会话
    Session::Start()
  • 在域A上创建一个像这样的映像

  • 在域B上创建如下路由:

  • 完成后,现在您应该能够通过
    $user=Auth::user

  • 如果要在多个子域之间共享会话,则必须设置域名config/session.php已设置域名

    示例:如果您有new.Example.com和test.Example.com,则必须将域名设置为Example.com

    'domain'     => env('SESSION_DOMAIN_URL','.example.com')
    

    那里的解决方案对我有效,特别是设置域,然后清除浏览器cookies和缓存。

    动态地在sessionDomains表单db或字符串中指定您的域 只需替换best4games.com

    class SessionDomains
    {
        /**
         * Handle an incoming request.
         *
         * @param  Request  $request
         * @param  Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            if($request->getHost() === 'best4games.com'){
                config([
                    'session.domain' => '.best4games.com'
                ]);
            }
            return $next($request);
        }
    }
    
    kernal.php

    protected $middlewareGroups = [
            'web' => [
                SessionDomains::class,
            ],
        ];
    
    及以上优先级组中的启动会话

        protected $middlewarePriority = [
            SessionDomains::class,
            StartSession::class,
            ShareErrorsFromSession::class,
            Authenticate::class,
            ThrottleRequests::class,
            AuthenticateSession::class,
            SubstituteBindings::class,
            Authorize::class,
        ];
    

    我希望这是可能的,但事实并非如此。如果是相同的laravel安装,但有不同的域,那么一旦你从域A登录到你的应用程序,你就无法向自己发送POST请求并启动会话。我找到了一种更简单的方法,请检查我的回答警告:不要以纯文本形式发送电子邮件,这意味着我可以编辑html标记,并基本上登录到其他域上的任何帐户。使用你的应用程序密钥加密文本。对于任何使用此方法的人,我不确定此方法是否安全,这是google过去的做法,但是现在他们使用OAuth来存储会话中的简单内容,这是life saverI使用此方法,我所做的唯一小更改是传递加密的会话id,而不是普通id。如下所示:
    Session::setId(Crypt::decrypt($\u GET['id'])标题下添加了这一行('P3P:CP=“这不是策略”)您可以在中阅读更多关于P3P头的信息。最好创建一个.env变量,如(SESSION_DOMAIN=.example.com)。在同一个laravel项目上为我工作。cookie只能发布到特定的子域吗?例如仅限new.example.com和test.example.com?而不是其他子域?要从另一个Laravel项目访问会话,我必须再次实现用户模型吗?我是否应该将驱动程序更改为Cookie而不是文件?已测试且不工作@不过,希拉格的回答是有效的
    
        protected $middlewarePriority = [
            SessionDomains::class,
            StartSession::class,
            ShareErrorsFromSession::class,
            Authenticate::class,
            ThrottleRequests::class,
            AuthenticateSession::class,
            SubstituteBindings::class,
            Authorize::class,
        ];