全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

php如何实现单点登录功能_php跨域名共享会话ticket验证方案

单点登录通过中心认证服务实现跨域身份验证,用户在SSO Server登录后获取一次性ticket,经重定向传递至客户端,客户端通过验证接口校验ticket并建立本地会话,利用Redis存储ticket信息并设置过期时间,结合HTTPS、来源校验等机制保障安全,登出时由中心通知各客户端销毁会话。

单点登录(SSO)的核心是让用户在一个系统中登录后,访问其他关联的系统时无需重复登录。在 PHP 中实现跨域名的 SSO,关键在于如何安全地共享用户身份凭证(ticket),尤其是在不同域名之间无法直接共享 Cookie 的情况下。

基本原理:基于中心认证服务的 Ticket 验证

搭建一个独立的认证中心(SSO Server),所有子系统(Client A、Client B 等)都信任该中心。用户首次访问任意子系统时,被重定向到 SSO Server 登录。登录成功后,SSO Server 发放一个一次性 ticket,并通过回调方式通知原系统完成身份确认。

典型流程如下:
  • 用户访问 client-a.com,未登录,跳转至 sso-server.com?redirect=client-a.com/callback
  • 用户在 sso-server.com 输入账号密码登录
  • 登录成功,sso-server.com 生成唯一 ticket(如 tkt-abc123),存储在服务端(Redis 推荐)并设置有效期
  • 重定向回 client-a.com/callback?ticket=tkt-abc123
  • client-a.com 收到 ticket,向 sso-server.com/api/validate 发起请求验证 ticket 合法性
  • sso-server 验证通过后返回用户信息,并标记该 ticket 已使用(防止重放攻击)
  • client-a.com 创建本地会话,用户登录成功

跨域名共享的关键:Ticket 传递与验证

由于 Cookie 不可跨域共享(如 client-a.com 无法读取 client-b.com 的 session),必须依赖中心服务器进行身份仲裁。ticket 是一次性的,通过 URL 参数传递,安全性较高。

实现要点:
  • Ticket 存储: 使用 Redis 存储 ticket 与用户信息的映射,设置自动过期时间(如 5 分钟)
  • 验证接口: SSO Server 提供 /api/validate?t=xxx 接口,返回 JSON 格式数据(是否有效、用户 ID、用户名等)
  • HTTPS 必须启用: 所有通信需走 HTTPS,防止 ticket 被窃听
  • Referer 或签名校验: 可增加来源域名白名单或请求签名,防止伪造验证请求

PHP 实现示例片段

SSO Server 生成 ticket(登录成功后):

$ticket = 'tkt_' . bin2hex(random_bytes(16));
$userId = 123;
// 存入 Redis,5分钟过期
$redis->setex($ticket, 300, json_encode(['user_id' => $userId, 'used' => false]));
header('Location: ' . $_GET['redirect'] . '?ticket=' . $ticket);

Client 端验证 ticket:

if (isset($_GET['ticket'])) {
  $ticket = $_GET['ticket'];
  $response = file_get_contents("https://sso-server.com/api/validate?t={$ticket}");
  $data = json_decode($response, true);
  if ($data['valid'] && !$data['used']) {
    $_SESSION['user_id'] = $data['user_id'];
    // 标记 ticket 已使用(由 server 完成)
  }
}

SSO Server 验证接口(/api/validate):

$t = $_GET['t'];
$data = $redis->get($t);
if (!$data) {
  echo json_encode(['valid' => false]); exit;
}
$info = json_decode($data, true);
if ($info['used']) {
  echo json_encode(['valid' => false]); exit;
}
// 标记为已使用,防止重放
$info['used'] = true;
$redis->setex($t, 300, json_encode($info)); // 更新状态
echo json_encode(['valid' => true, 'user_id' => $info['user_id']]);

登出处理

登出需要通知所有已登录的客户端。可在 SSO Server 记录用户的 active sessions,登出时向各 client 发起异步登出请求(如 client-a.com/sso/logout?token=xxx),各 client 销毁本地 session。

基本上就这些。核心是信任中心 + 一次性 ticket + 安全传输。不复杂但容易忽略细节,比如 ticket 过期、重放、来源校验等。


# php  # redis  # js  # json  # go  # cookie  # session  # 跨域  # 安全传输  # red  # echo  # if 


相关文章: 如何打造高效商业网站?建站目的决定转化率  建站之星如何快速生成多端适配网站?  简历在线制作网站免费,免费下载个人简历的网站是哪些?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  焦点电影公司作品,电影焦点结局是什么?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  已有域名能否直接搭建网站?  自助网站制作软件,个人如何自助建网站?  如何获取开源自助建站系统免费下载链接?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  北京企业网站设计制作公司,北京铁路集团官方网站?  如何零基础开发自助建站系统?完整教程解析  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  如何在Ubuntu系统下快速搭建WordPress个人网站?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  如何快速生成专业多端适配建站电话?  如何选择靠谱的建站公司加盟品牌?  建站之星如何助力企业快速打造五合一网站?  建站之星2.7模板快速切换与批量管理功能操作指南  如何通过二级域名建站提升品牌影响力?  建站之星3.0如何解决常见操作问题?    大学网站设计制作软件有哪些,如何将网站制作成自己app?  如何确保FTP站点访问权限与数据传输安全?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  如何在Windows 2008云服务器安全搭建网站?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  建站之星备案是否影响网站上线时间?  测试制作网站有哪些,测试性取向的权威测试或者网站?  制作网站怎么制作,*游戏网站怎么搭建?  如何在阿里云香港服务器快速搭建网站?  如何通过多用户协作模板快速搭建高效企业网站?  已有域名建站全流程解析:网站搭建步骤与建站工具选择  公司门户网站制作流程,华为官网怎么做?  如何自定义建站之星模板颜色并下载新样式?  ,制作一个手机app网站要多少钱?  企业微网站怎么做,公司网站和公众号有什么区别?  linux top下的 minerd 木马清除方法  如何高效配置香港服务器实现快速建站?  子杰智能建站系统|零代码开发与AI生成SEO优化指南  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  IOS倒计时设置UIButton标题title的抖动问题  建站VPS选购需注意哪些关键参数?  如何在云指建站中生成FTP站点?  制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?  平台云上自助建站如何快速打造专业网站?  如何快速查询域名建站关键信息? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。