主要思想:首先需要共享session_id 然后单个网站登录时。通过加密sessionid和用户信息生成一个cookie(),另一个网站进入时如果有这个cookie ,则解析这个cookie.获取登录状态 设置自动登录
1.看上一个随笔,将两个站点的cookie的domain设置为顶级域名
2.开启跨域中间件:
app/middleware.php
<?php // 全局中间件定义文件 return [ //跨域 hinkmiddlewareAllowCrossDomain::class, // 全局请求缓存 // hinkmiddlewareCheckRequestCache::class, // 多语言加载 // hinkmiddlewareLoadLangPack::class, // Session初始化 hinkmiddlewareSessionInit::class ];
3.生成rsa加密密钥
http://tool.chacuo.net/cryptrsapubkey
4.编写加密解密方法 公钥以及私钥配置在:config/app.php
function en_de_crypt($type,$data){ //获取sessionid $private_key_pem = config('app.private_key'); // $password = config('app.password'); $public_key_pem = config('app.public_key'); // $data = '123321'; #校验私钥,如果有证书密码,则填写第二参数 // $private_key_pem2=openssl_get_privatekey ($private_key_pem); // /***第二种***/ // //私钥加密 // $res=openssl_private_encrypt($data,$signature,$private_key_pem); // var_dump($res); // //公钥解密,$decode是解密后的数据 // $res=openssl_public_decrypt($signature,$decode,$public_key_pem); // var_dump($res,$decode); if($type == 1){ //加密 //公钥加密 openssl_public_encrypt($data,$signature,$public_key_pem); return $signature; }else{ //解密 //私钥加密,$decode是解密后的数据 openssl_private_decrypt($data,$decode,$private_key_pem); return $decode; } }
5.登陆时操作
//记录登录cookie 使用PHPSESSID 拼接 用户id 再进行RSA加密 $php_sessid = cookie('PHPSESSID'); $data = $php_sessid.$user['id']; $cn = $this->en_de_crypt(1,$data); cookie('googlespider',$cn);
6.进入网站时操作:
$this->user = session('user'); if(!$this->user){ $login_cookie = $_COOKIE['googlespider']??''; /**登录后生成加密的cookie 来*/ if($login_cookie){ $phpssid = cookie('PHPSESSID'); $decrypted_data = $this->en_de_crypt(2,$login_cookie); if($decrypted_data){ $id = str_replace($phpssid,'',$decrypted_data); $user = User::find($id); if($user){ session('user',$user); $this->user = $user; // cookie('googlespider',null); } } } }
7.登出时操作:
/** * 用户退出 * @return mixed */ public function out() { session('user', null); session('open_id',NULL); cookie("googlespider", NULL); // cookie("PHPSESSID", null,['domain'=>'xx.cn']); setcookie("PHPSESSID", null, time() - 1000, "/", "xx.cn"); /*session('user', null); session('open_id',NULL); session_start(); session_destroy();*/ if(!$this->request->param('from')){ echo '<script>window.location.href="https://s.x.cn/out?from=1"</script>'; }else{ $this->success('退出登录成功', [], 'https://x.a.cn/'); } $this->success('退出登录成功', [], '/'); }