猿问

PHP开发SSO单点登录系统时如何实现Seesion跨域共享

本人目前尝试把个人网站导航(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();//关闭数据库连接
        }
    }
}


ddawx123
浏览 3831回答 1
1回答
随时随地看视频慕课网APP
我要回答