Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

Passport 通行证 整合

[复制链接]
puyang 发表于 2006-6-2 19:46:33 | 显示全部楼层
那么怎么才能实现asp 和php统一的加密呢?也就是说代码如何更改?
回复

使用道具 举报

cjpsn 发表于 2006-6-3 11:05:42 | 显示全部楼层

感谢楼主的无私奉献!

168整站整合dz问题:

直接将你提供的整合代码保存为login.php文件,上传覆盖168整站下的同名文件!在整站页面点击登录,出现提示:

Passport disabled


不知道是何原因,烦请朋友能说得详细一点,你的代码,我还要做些什么?



//=========168整站 与 discuz的passport整合===========
//假设discuz安装路径为168整站下的一个文件夹discuz_bbs/
//discuz_bbs 的通行证passportkey=1234567890
//已经调试通过

require_once("./global.php");
if(!$jumpurl||ereg("login.php",$jumpurl) ){
        if($_COOKIE['loginurl'] && !ereg("login.php",$_COOKIE['loginurl'])){
                $jumpurl=$_COOKIE['loginurl'];
        }elseif( !ereg("login.php",$FROMURL) ){
                $jumpurl=$FROMURL;
        }else{
                $jumpurl="./index.php";
        }
}

if($lfjid&&$action!="quit"){

        refreshto("./","have_login",0);

}elseif($action=="quit"){
        //if( is_passport ){
                setcookie('passport',"",0,'/');
        //}else{
        //        setcookie('lfjuid','',0,'/');
        //        setcookie('lfjid','',0,'/');
        //        setcookie('lfjpwd','',0,'/');
        //        setcookie('loginurl','',0,'/');
        //}
               
               
               
                //=====================================================
                //============================discuz logout 整合==============
                //=====================================================
                $passportkey="1234567890";//这里换成你论坛通行证设置的passportkey
                $auth=$_COOKIE['auth'];//这里是login完成时设置的cookie auth
                setcookie("auth", "",time() - 3600);
                $forward=$_GET['forward'];
                $forward=($forward=="")?$FROMURLforward;                                       
                $verify = md5('logout'.$auth.$forward.$passportkey);
                $auth=rawurlencode($auth);
                $forward=rawurlencode($forward);
                header("Location: discuz_bbs/api/passport.php?action=logout&auth=$auth&forward=$forward&verify=$verify");
                //=====================================================
                //============================discuz logout 整合结束============
                //=====================================================
               
               
        
               
               
                //refreshto($FROMURL,'quit_succeed'); 这句屏蔽

}elseif($step){

        if(!$loginuser){
                showerr("forbid_no_username");
        }elseif(!$loginpwd){
                showerr("forbid_no_pwd");
        }
        $loginpwd=md5($loginpwd);

        $logindb=$db->get_one("select * from {$P_M[m][table]} where {$P_M[m][username]}='$loginuser' ");
        if($logindb){
                $logindb[password]=$logindb[$P_M[m][password]];
                $logindb['thisvisit']=$logindb[$P_M[m][thisvisit]];
                $logindb[yz]=$logindb[$P_M[m][yz]];
                $logindb[onlineip]=$logindb[$P_M[m][onlineip]];
                $logindb[uid]=$logindb[$P_M[m][uid]];
                $logindb[username]=$logindb[$P_M[m][username]];
                                $logindb[email]=$logindb[$P_M[m][email]];//这一句需要                                
        }
        if(!$logindb['password']){
                showerr("no_username");
        }elseif($logindb['password']!=$loginpwd){
                showerr("pwd_err");
        }elseif($logindb['password']==$loginpwd){
                if($logindb['yz']>1){
                        showerr("no_yz");
                }
                if( date("d",$logindb['thisvisit'])!=$usr_info['today'] ){
                        $SQL=",{$P_M[m][todaypost]}=0,{$P_M[m][attach]}=0 ";
                }else{
                        $SQL="";
                }
                $logindb[thisvisit] || $logindb[thisvisit]=$timestamp;
                $db->query("update {$P_M[m][table]} set {$P_M[m][lastvisit]}='$logindb[thisvisit]',{$P_M[m][thisvisit]}='$timestamp',{$P_M[m][loginnum]}={$P_M[m][loginnum]}+1,{$P_M[m][lastip]}='$logindb[onlineip]'$SQL where {$P_M[m][username]}='$loginuser' ");

                if($cktime){
                        $cktime=$timestamp+$cktime;
                }else{
                        $cktime=$timestamp+3600;   //默认为1小时  这里有点问题
                }
               
                //if(is_passport){
                        setcookie('passport',"$logindb[uid]\t$loginuser\t$loginpwd",$cktime,'/');
                //}else{
                //        setcookie('lfjuid',$logindb['uid'],$cktime,'/');
                //        setcookie('lfjid',$logindb['username'],$cktime,'/');
                //        setcookie('lfjpwd',$loginpwd,$cktime,'/');
                //        setcookie('loginurl','',0);
                //}
                $lfjdb=$logindb;
                write_usrinfo($lfjdb);
                                
                                //=======================================
                                //============================discuz login 整合=
                                //=======================================
                                //==============header到bbs=================        
                                $member = array
                                (
                                        'cookietime'                => $cktime,
                                        'time'                        => time(),
                                        'username'                => $logindb[username],
                                        'password'                => $logindb[password],
                                        'email'                        => $logindb[email]
                                );
                                $passportkey="1234567890";//这里换成你论坛通行证设置的passportkey
               
                                $auth = passport_encrypt(passport_encode($member), $passportkey);
                                setcookie("auth",$auth,$cktime);
                                $forward=$_POST['forward'];
                                $forward=($forward=="")?$jumpurlforward;                                       
                                $verify = md5('login'.$auth.$forward.$passportkey);
                                $auth=rawurlencode($auth);
                                $forward=rawurlencode($forward);
                                header("Location: discuz_bbs/api/passport.php?action=login&auth=$auth&forward=$forward&verify=$verify");                        

                                
                                
                //refreshto($jumpurl,'login_succeed');
        
               
                }

}else{

        require_once(html("css"));
        require_once(html("head"));
        require_once(html("login"));
        require_once("foot.php");

}





//=============================================================
//=============以下为拷贝过来的函数=============================


/**
* Passport 加密函数
*
* @param                string                等待加密的原字串
* @param                string                私有密匙(用于解密和加密)
*
* @return        string                原字串经过私有密匙加密后的结果
*/
function passport_encrypt($txt, $key) {

        // 使用随机数发生器产生 0~32000 的值并 MD5()
        srand((double)microtime() * 1000000);
        $encrypt_key = md5(rand(0, 32000));

        // 变量初始化
        $ctr = 0;
        $tmp = '';

        // for 循环,$i 为从 0 开始,到小于 $txt 字串长度的整数
        for($i = 0; $i < strlen($txt); $i++) {
                // 如果 $ctr = $encrypt_key 的长度,则 $ctr 清零
                $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
                // $tmp 字串在末尾增加两位,其第一位内容为 $encrypt_key 的第 $ctr 位,
                // 第二位内容为 $txt 的第 $i 位与 $encrypt_key 的 $ctr 位取异或。然后 $ctr = $ctr + 1
                $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
        }

        // 返回结果,结果为 passport_key() 函数返回值的 base65 编码结果
        return base64_encode(passport_key($tmp, $key));

}

/**
* Passport 解密函数
*
* @param                string                加密后的字串
* @param                string                私有密匙(用于解密和加密)
*
* @return        string                字串经过私有密匙解密后的结果
*/
function passport_decrypt($txt, $key) {

        // $txt 的结果为加密后的字串经过 base64 解码,然后与私有密匙一起,
        // 经过 passport_key() 函数处理后的返回值
        $txt = passport_key(base64_decode($txt), $key);

        // 变量初始化
        $tmp = '';

        // for 循环,$i 为从 0 开始,到小于 $txt 字串长度的整数
        for ($i = 0; $i < strlen($txt); $i++) {
                // $tmp 字串在末尾增加一位,其内容为 $txt 的第 $i 位,
                // 与 $txt 的第 $i + 1 位取异或。然后 $i = $i + 1
                $tmp .= $txt[$i] ^ $txt[++$i];
        }

        // 返回 $tmp 的值作为结果
        return $tmp;

}

/**
* Passport 密匙处理函数
*
* @param                string                待加密或待解密的字串
* @param                string                私有密匙(用于解密和加密)
*
* @return        string                处理后的密匙
*/
function passport_key($txt, $encrypt_key) {

        // 将 $encrypt_key 赋为 $encrypt_key 经 md5() 后的值
        $encrypt_key = md5($encrypt_key);

        // 变量初始化
        $ctr = 0;
        $tmp = '';

        // for 循环,$i 为从 0 开始,到小于 $txt 字串长度的整数
        for($i = 0; $i < strlen($txt); $i++) {
                // 如果 $ctr = $encrypt_key 的长度,则 $ctr 清零
                $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
                // $tmp 字串在末尾增加一位,其内容为 $txt 的第 $i 位,
                // 与 $encrypt_key 的第 $ctr + 1 位取异或。然后 $ctr = $ctr + 1
                $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
        }

        // 返回 $tmp 的值作为结果
        return $tmp;

}

/**
* Passport 信息(数组)编码函数
*
* @param                array                待编码的数组
*
* @return        string                数组经编码后的字串
*/
function passport_encode($array) {

        // 数组变量初始化
        $arrayenc = array();

        // 遍历数组 $array,其中 $key 为当前元素的下标,$val 为其对应的值
        foreach($array as $key => $val) {
                // $arrayenc 数组增加一个元素,其内容为 "$key=经过 urlencode() 后的 $val 值"
                $arrayenc[] = $key.'='.urlencode($val);
        }

        // 返回以 "&" 连接的 $arrayenc 的值(implode),例如 $arrayenc = array('aa', 'bb', 'cc', 'dd'),
        // 则 implode('&', $arrayenc) 后的结果为 ”aa&bb&cc&dd"
        return implode('&', $arrayenc);

}


//===================================================================
//===========================拷贝结束===================================
?>
回复

使用道具 举报

cjpsn 发表于 2006-6-3 11:09:29 | 显示全部楼层

本地测试

登录:

http://127.0.0.1/discuz_bbs/api/ ... 3b90f1d578eeaaa38f4




出现Passport disabled


dz中的有关代码要修改吗?

[ 本帖最后由 cjpsn 于 2006-6-3 11:11 编辑 ]
回复

使用道具 举报

 楼主| huozhe3136 发表于 2006-6-3 11:13:48 | 显示全部楼层
你首先要到discuz后台管理的页面设置-->通行证设置
具体怎么设置。。。不用多讲了吧。。。。。。。。。
回复

使用道具 举报

cjpsn 发表于 2006-6-3 12:44:05 | 显示全部楼层
我试试看!
回复

使用道具 举报

cjpsn 发表于 2006-6-3 13:08:44 | 显示全部楼层

168整合dz安装测试问题报告(一)

huozhe3136 ,你好!

       应楼主意见,已经将首次发帖“鉴于彰显”表述改动!我测试了朋友你给的代码,测试基本成功!只是在dz页面退出时不是直接回到dz页面,而是直接跳转到168整站页面,要整体退出,还需在168整站页面再次点击退出按钮!登录问题基本完善!在168整站页面注册用户名,成功后,进入168首页,点击dz链接,反映dz尚未登录!需在168整站先退出,再次登录,才能实现168和dz同步登录!
       以上只是个人测试过程中遇到的一点情况!
       是不是还要完善!
回复

使用道具 举报

cjpsn 发表于 2006-6-3 15:06:50 | 显示全部楼层
在unix下使用出现链接错误!

数据库连接出错:select groupid AS groupid,uid AS uid,adminid AS memberid,username AS username from cdb_members where username='cjp' AND password='52c69e3a57331081823331c4e69d3f2e'

Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) for operation '='
1267
回复

使用道具 举报

cjpsn 发表于 2006-6-3 15:29:32 | 显示全部楼层
数据库连接出错:SELECT * FROM cdb_members WHERE uid='2' AND password='52c69e3a57331081823331c4e69d3f2e'

Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) for operation '='
1267数据库连接出错:select * from cdb_threads where ( fid='99990' OR fid=23 OR fid=9 OR fid=24 OR fid=10 OR fid=11 OR fid=12 OR fid=19 OR fid=18 OR fid=20 OR fid=21 OR fid=22 OR fid=25 OR fid=26 OR fid=27 OR fid=28 OR fid=29 OR fid=30 OR fid=31 OR fid=32 OR fid=33 OR fid=34 OR fid=35 OR fid=2 OR fid=13 OR fid=14 OR fid=15 OR fid=17 OR fid=5 OR fid=4 OR fid=6 OR fid=7 ) order by postdate desc limit 0,10

Unknown column 'postdate' in 'order clause'
1054
回复

使用道具 举报

cjpsn 发表于 2006-6-3 17:48:03 | 显示全部楼层
数据库连接出错:select groupid AS groupid,uid AS uid,adminid AS memberid,username AS username from cdb_members where username='cjp' AND password='52c69e3a57331081823331c4e69d3f2e'

Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) for operation '='
1267
回复

使用道具 举报

puyang 发表于 2006-6-4 15:35:47 | 显示全部楼层
已经找到动易中文用户名的问题所在。
===========================================
================动易官方的回答==================
===========================================
系统改进了对用户登录的调用方式--采用了AJAX模式,这种方式不同于先前版本用ifrom的窗口嵌套方式。虽然系统依然保留UserLogin.asp文件和ifrom调用方式,只是为了兼容先前版本的模板而保留的。新版用户登录的显示效果均存放于JS目录下的checklogin.js文件中的ShowLoginForm函数里,其他部分请不要修改。其中if(loginstat=='err')用来判断显示登录前状态还是登录后的状态,showtype提供的是3种不同的登录显示方式。

修改要点:

一 本文件里的中文均采用UTF8编码模式,修改时请使用支持UTF8的编辑软件进行修改,保存时也应保持UTF8模式,或者可以用下面的这个小工具进行转码后编辑,保存前记得要转回UTF8模式。

下载GB转UTF8工具

二 由于JS处理的需求,在输出的字符里,每个符号前面要加上“/”字符,保持“/”的形式。

三 修改时要经常备份,一旦出错后即可恢复到上一步重新修改。
================================================

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-11-24 07:26 , Processed in 0.027956 second(s), 4 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表