2014-11-08 172 views
4

我在Laravel构建了一个多域/多商店电子商务应用程序,并希望在用户从商店更改为商店时保持登录状态。Laravel:通过多个域共享会话数据

但据我所知,Laravel的Auth服务会将登录的用户保存在会话中,并且会话不能被其他域访问。

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

在此先感谢!

回答

5
  1. 捕获在域的会话ID Session::getId()一个
  2. 通过HTTP POST发送捕获的会话ID域B
  3. 访问域B发送的会话ID $sessionid_from_domainA = $_POST['session_from_A']
  4. 设置会话域B Session::setId($sessionid_from_domainA)
  5. 开始会话域B Session::start()
+0

我希望它是可能的,但不是。如果它具有相同的laravel安装但具有不同的域,则一旦您从域A登录到您的应用程序,就无法向自己发送POST请求并开始会话。 – 2016-05-10 13:22:32

+0

我发现了一个更简单的方法来做到这一点,检查我的答案 – Albert 2016-11-07 05:53:37

2

我的工作类似的东西太单一登录系统,仍在努力寻找解决办法,但这里是一个开始http://laravel.io/forum/03-14-2014-multiple-domains-how-to-share-login

在laravel你可以改变/app/config/session.php司机使用网站


编辑:

这是我做了什么。

您可以使用像素图像共享cookie跨域。 例如,当你登录上domain1.com要创建domain2.com一个cookie,登录之后就domain1.com你需要有这样的事情

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

上domain2.com上面的路线:

  1. 将首先检查用户是否在 登录
  2. 如果没有登录将读取的散列(例如电子邮件地址),检查是否存在与用户电子邮件,并在那里登录,还设置了一个cookie
+0

警告,让您的用户: 不要发送电子邮件在以纯文本格式,这意味着我可以编辑html标签,并基本登录到其他域的任何帐户。使用您的应用密钥加密文本。 – Albert 2016-11-07 05:41:37

1

您可以手动设置会话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.comstore2.shops.com共享会话,但不可以有myshop.comshopsmart.com

如果你需要这种格式的东西,你可能会更好通过创建一个身份验证服务,并使用访问令牌来验证凭据。你也可以看看像OneLogin这样的服务。

2
  1. 在域A创建的图像,像这样<img src="https://DOMAINB.com/setcookie?id={{ Session::getId() }}" style="display:none;" />

  2. 在域B创建路线如下所示:

Route::get('setcookie', function(){ 
    Session::setId($_GET['id']); 
    Session::start(); 
    return 'Cookie created'; 
});` 
  • 完成,现在你应该可以通过$user = Auth::User;
  • +0

    对于任何人使用这个,我不确定这种方法是否安全,这是谷歌如何使用它,但现在他们使用OAuth – Albert 2017-10-19 06:13:35