Session Laravel:在多个域上共享会话数据
我正在Laravel中构建一个多域/多商店的电子商务应用程序,希望在用户从一个商店切换到另一个商店时保持登录状态 但据我所知,Laravel的身份验证服务将登录用户保存在会话中,其他域无法访问会话 有没有一种方法(可能是一个包)可以实现这一点,而不会让我的应用程序容易出现安全问题Session Laravel:在多个域上共享会话数据,session,authentication,laravel,cross-domain,Session,Authentication,Laravel,Cross Domain,我正在Laravel中构建一个多域/多商店的电子商务应用程序,希望在用户从一个商店切换到另一个商店时保持登录状态 但据我所知,Laravel的身份验证服务将登录用户保存在会话中,其他域无法访问会话 有没有一种方法(可能是一个包)可以实现这一点,而不会让我的应用程序容易出现安全问题 提前谢谢 我也在开发类似的单点登录系统,仍在寻找解决方案,但这是一个开始 在laravel上,您可以将/app/config/session.php驱动程序更改为cookie 编辑: 这就是我所做的 您可以使用像素图
提前谢谢 我也在开发类似的单点登录系统,仍在寻找解决方案,但这是一个开始 在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将注册到哪个域,从而使它们在不同站点间保持。只需在以下部分编辑
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
如果您需要这种格式的东西,那么通过创建身份验证服务,并使用访问令牌验证凭据,您可能会过得更好。您还可以查看类似的服务
session::getId()
$sessionid\u from\u domainA=$\u POST['session\u from\u A']
session::setId($sessionid\u from\u domainA)
Session::Start()
$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'])另外,我在IE9及以下版本上遇到了一个问题。它们需要设置P3P头,以便为其他域正确设置cookie。因此,我在Session::start():标题下添加了这一行('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,
];