我正在使用Laravel构建一个多域名/多商店的电子商务应用程序,希望用户在从一个商店切换到另一个商店时仍然保持登录状态。
但据我所知,Laravel的身份验证服务将已登录的用户保存在会话中,其他域名无法访问这些会话。
是否有一种方法(也许是一个软件包)可以实现这一点,而不会让我的应用程序容易受到安全问题的影响?
提前感谢!
我正在使用Laravel构建一个多域名/多商店的电子商务应用程序,希望用户在从一个商店切换到另一个商店时仍然保持登录状态。
但据我所知,Laravel的身份验证服务将已登录的用户保存在会话中,其他域名无法访问这些会话。
是否有一种方法(也许是一个软件包)可以实现这一点,而不会让我的应用程序容易受到安全问题的影响?
提前感谢!
Session::getId()
$sessionid_from_domainA = $_POST['session_from_A']
Session::setId($sessionid_from_domainA)
Session::start()
如果您希望在多个子域之间共享会话,那么您需要设置配置文件config/session.php中的域名。
例如:如果您有new.example.com和test.example.com,则需要将域名设置为example.com。
'domain' => env('SESSION_DOMAIN_URL','.example.com')
这些解决方案对我有用,具体来说是设置域名,然后清除浏览器的Cookie和缓存。
在域名A上创建如下的图片:<img src="https://DOMAINB.com/setcookie?id={{ Session::getId() }}" style="display:none;" />
在域名B上创建一个路由,形式如下:
.
Route::get('setcookie', function(){
Session::setId($_GET['id']);
Session::start();
return 'Cookie created';
});`
$user = Auth::User;
获取你的用户。Session::setId(Crypt::decrypt($_GET['id']));
此外,我在IE9及以下版本中遇到了问题。为了使cookie在其他域中正确设置,需要设置P3P头。因此,在Session::start()下面添加了以下行:
header('P3P: CP="This is not a policy"');
您可以在此帖子中了解有关P3P头的更多信息。 - Harry Potts我知道这不完全是被要求的,但是为了开发和测试目的,我做了以下操作:
在config/session.php中,尝试更改以下行:
'path' => '/',
进入这里
'path' => '/;SameSite=None; secure',
现在,您应该能够编写一个简单的中间件来防止不需要的主机访问。就像这样:
允许我从不同的域进行身份验证。
namespace App\Http\Middleware;
use Illuminate\Http\Request;
use Closure;
class TrustedHosts{
public function handle($request, Closure $next){
//$host = $request->getHost();
$host = $request->headers->get('origin');
$enviroment = env('APP_ENV');
if ( $enviroment == 'development' ) {
$trustedHosts = array('localhost', 'dev.mydomain.com');
}
else {
$trustedHosts = array('anotherdomain.com', 'mydomain.com');
}
$isHostTrusted = in_array($host, $trustedHosts);
if ( !$isHostTrusted ) return response("I'm a teapot", 418); //Or any other code and message that you prefer.
return $next($request);
}
}
并将其分组到包含会话内容的中间件组中。
编辑:
这是我所做的。
您可以使用像素图像在跨域之间共享cookie。 例如,当您在domain1.com上登录时,您希望在domain2.com上创建一个cookie,在domain1.com上登录后,您需要有类似于以下内容的东西
<img src="http://www.domain2.com/create-cookie?param=hash">
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
这样的网站共享。
如果您需要此格式的内容,则最好创建身份验证服务,并使用访问令牌来验证凭据。您还可以查看OneLogin等服务。
$_SERVER ['HTTP_HOST']
:/config/session.php
'domain' => env('SESSION_DOMAIN', $_SERVER['HTTP_HOST']),
php artisan config:clear
,不要关注警告消息,只需确保最终获得了Configuration cache cleared!
。通过这种方式,您的应用程序会话将在任何域上正常工作。