本人目前尝试把个人网站导航(www.dingstudio.cn)、个人的博客网站(blog.dingstudio.cn)、相册管理系统(album.dingstudio.cn)、心情语录发布站(w.dingstudio.cn)以及网页邮箱系统(mail.dingstudio.cn)都接入自己开发的SSO单点登录系统。
SSO所在域名:passport.dingstudio.cn,上述域名均部署了https协议访问,目前各应用均无法检测到由passport系统产生的session,passport的登录认证模块和会话超时、会话续期系统已全部开发完毕。
目前设计需求是SSO应用程序通过其他业务应用重定向时携带参数url,如login.php?url=http://www.dingstudio.cn/callback.php 处理登录成功后的跳转。callback.php为各个应用的回调接口,登录成功后的信息同步处理均交给callback.php。(URL参数读取、处理已经开发完毕并封装了一个类)
部分passport核心代码:(这些代码都是写在一个php类里,前端入口通过require_once进行调用)
public static function SSOCheckExist($special = '0') { $nowtime = date('Ymdhis',time()); session_start(); if(isset($_SESSION['dingstudio_sso']) && $nowtime - $_SESSION['dingstudio_ssotoken'] <= 600) { $_SESSION['dingstudio_ssotoken'] = $nowtime;//系统会话自动续期 return "authed";//存在合法会话且处于时效期限内,返回自动登陆 } else { return "noauth";//不存在合法会话或有效密钥超时,返回请求登陆 } } public static function SSOCheck($username, $password) { if(isset($username) and isset($password)) { $sqlconn = MySQLInstance::getInstance()->connect();//通过单例方式建立MySQL数据库连接 if($sqlconn->connect_error) { return "error-654";//返回数据库服务器宕机错误码 } else { $sqlcode = "select * from users where (username='$username') and (password='$password')";//查询数据库检测账户密码是否匹配 $result = $sqlconn->query($sqlcode);//执行上述SQL语句 if($result->num_rows > 0) {//登陆成功后 $dtoken = date('Ymdhis',time());//产生SSO令牌码(使用时间) $_SESSION['dingstudio_sso'] = $username;//同步用户名到Session $_SESSION['dingstudio_ssotoken'] = $dtoken;//同步SSO令牌码到Session $sqlcode = "update users set usertoken='{$dtoken}' where username='$username'";//更新SSO令牌码到数据库 $result = $sqlconn->query($sqlcode);//执行上述SQL语句 return "authed";//返回认证成功 } else { return "noauth";//返回认证失败 } MySQLInstance::getInstance()->disconnect();//关闭数据库连接 } } }