您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

Discuz! Passport 通行证整合_PHP教程

2024/4/23 15:04:54发布18次查看
解决办法:
第一步: 到dz的数据库表cdb_settings 找到下面这几行修改为
第二步: 删除dz安装目录/forumdata/cache/cache_settings.php
第三步: 重新访问论坛
登陆和注册整合流程
用户从登陆或注册表单提交帐号密码信息 ==>
主站程序检验用户登陆或注册,成功(注册需要生成新用户)则 ==>
设置主站自身的cookie或session    ==>
url传递 返回地址forward和编码后的用户信息和其他信息 到dz/api/passport.php
整合之前请先仔细阅读官方passport技术文档: http://www.discuz.net/usersguide/advanced_passport.htm
用户名:
密码:
time(),
                        'username' => $row[username],
                        'password' => $row[pwd],
                        'email'    => $row[email]
        );
        $auth = passport_encrypt(passport_encode($member), $passportkey);
        setcookie(auth,$auth,($_post[cookie]? time()+(int)$_post[cookie] :0));
        $forward=$_post['forward'];
        if($forward==)$forward=../../index.php;                                       
        $verify = md5('login'.$auth.$forward.$passportkey);
        $auth=rawurlencode($auth);
        $forward=rawurlencode($forward);
        header(location: bbs/api/passport.php?action=login&auth=$auth&forward=$forward&verify=$verify);                       
}
//=============================================================
//=============以下为拷贝过来的函数============================
function passport_encrypt($txt, $key) {
        srand((double)microtime() * 1000000);
        $encrypt_key = md5(rand(0, 32000));       
        $ctr = 0;
        $tmp = '';
        for($i = 0; $i                         $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
                        $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
        }
        return base64_encode(passport_key($tmp, $key));
}
function passport_decrypt($txt, $key) {
        $txt = passport_key(base64_decode($txt), $key);
        $tmp = '';
        for ($i = 0; $i                  $tmp .= $txt[$i] ^ $txt[++$i];
        }
        return $tmp;
}
function passport_key($txt, $encrypt_key) {
        $encrypt_key = md5($encrypt_key);
        $ctr = 0;
        $tmp = '';
        for($i = 0; $i                         $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
                        $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
        }
        return $tmp;
}
function passport_encode($array) {
        $arrayenc = array();
        foreach($array as $key => $val) {
                   $arrayenc[] = $key.'='.urlencode($val);
        }
        return implode('&', $arrayenc);
}
//=========================================================================
//===========================拷贝结束======================================
?>
第二篇:php168 v3.5与discuz v4.10的整合
168整站 与 discuz的passport整合
php168整站v3.5与discuz v4.1.0的整合(带视频)
使用说明
请注意自己所用的程序的版本号
login.php 登陆和退出的整合
register.php 注册的整合
整合前请先核对一下你使用的php168的login.php 和 register.php 是否和 整合文件.rar中[原文件] 文件夹下的文件相同
如果不同..请不要整合
(一)准备工作
1.下载php168 v3.5
2.下载discuz bbs v4.1.0
(二)安装和整合 (请参考视频安装)
1.安装php168 v3.5 (如已安装 到第2步) (如何安装请参考php168的安装说明)
2.进入php168的后台管理界面关闭168的论坛整合功能 (新安装可跳过)
3.在php168的安装目录下建立名称为bbs的文件夹
4.下载安装discuz bbs v4.1.0的upload/下的所有文件拷贝到bbs文件夹下
5.运行discuz bbs的install.php 进行安装
6.到discuz的后台管理设置开启通行证
具体参数如下
启用通行证:       是
应用程序 url 地址: http://localhost/php168/ 根据具体情况设置
通行证私有密匙:   1234567890 (如果这里改了..两个整合文件中的$passportkey的值也必须改成相同的值)
验证字串有效期(秒): 3600
应用程序注册地址:   register.php
应用程序登录地址:   login.php
应用程序退出地址:   login.php?action=quit
积分同步选项:     不同步积分
7.将整合压缩包中的login.php 和 register.php替换 php168下同名的文件
安装完成
/请保留以下信息,以方便其他网友在整合时遇到问题可以获得更多帮助
//整合贡献者: huozhe3136 疑问请加我qq: 2666556 (提供整合效果的演示)
//视频贡献: 一热心网友
//关于整合的更多内容请访问http://www.discuz.net/thread-304838-1-1.html
程序打包下载地址:http://www.photoxtd.com/chinaylrc/php168_discuz.rar
视频演示下载地址:http://www.photoxtd.com/chinaylrc/php168vcr.rar
apmserv5.12 下载地址: http://down.chinaz.com/s/7558.asp
/tech/uploadfile/200702/20070227023513192.rar
第三篇: asp程序与discuz v4.10的整合方法
1.文件discuz_passport.asp
'请保留以下信息以备出现问题时使用
'贡献者 huozhe3136 qq:2666556
'=====================================================
'============仿discuz passport编码函数================
'=====================================================
function passport_encrypt(txt, key)
                dim encrypt_key, encrypt_key_ary,txt_ary
                dim ctr,tmp,i     
        randomize
                encrypt_key=md5(int(32000* rnd),32)
                encrypt_key_ary=strtoary(encrypt_key)               
        txt_ary=strtoary(txt)     
        ctr = 0
        tmp =                
        for i = 0 to strlength(txt)-1
                        if ctr=len(encrypt_key)  then         ctr=0  else ctr=ctr                               
            tmp = tmp & encrypt_key_ary(ctr) &  mxor(txt_ary(i),encrypt_key_ary(ctr))
            ctr=ctr+1                                                    
        next
                passport_encrypt=stransi2unicode(base64encode(passport_key(tmp, key)))               
end function
'=====================================================
'============仿discuz passport解码函数================
'=====================================================
function passport_decrypt(txt, key)
                dim txt_ary,tmp,i               
                txt = passport_key(base64decode(strunicode2ansi(txt)), key)
                txt_ary = ansitoary(txt)
        ' 变量初始化
                tmp =
        for i = 0 to lenb(txt)-1
                  tmp = tmp & mxor(txt_ary(i),txt_ary(i+1))
                  i=i+1
                next
                passport_decrypt = stransi2unicode(tmp)
end function 
'=====================================================
'==========仿discuz passport 密匙处理函数=============
'=====================================================
function passport_key(ansitxt, encrypt_key)
                dim encrypt_key_tmp,encrypt_key_ary,txt_ary
                dim ctr,tmp,i
                encrypt_key_tmp = md5(encrypt_key,32)               
        encrypt_key_ary=strtoary(encrypt_key_tmp)               
                txt_ary=ansitoary(ansitxt)                
                ctr = 0
        tmp =                   
        for i=0 to lenb(ansitxt)-1                       
                    if ctr=len(encrypt_key_tmp) then ctr=0 else ctr=ctr
            tmp= tmp & mxor(txt_ary(i),encrypt_key_ary(ctr))
            ctr=ctr+1
        next
                passport_key=tmp               
end function
'=====================================================
'=================将字符串转换为ansi数组==============
'=====================================================
function strtoary(str)
   dim ary(),length,tmpstr,i
   tmpstr=strunicode2ansi(str)
   length=lenb(tmpstr)  
   redim ary(length)  
   for i=0 to length-1                                    
                ary(i)=midb(tmpstr,i+1,1)               
   next 
   strtoary=ary
end function
'=====================================================
'=================将ansi字符串转换为ansi数组==========
'=====================================================
function ansitoary(str)
   dim ary(),length,i
   length=lenb(str)  
   redim ary(length)  
   for i=0 to length-1                                    
                ary(i)=midb(str,i+1,1)               
   next 
   ansitoary=ary
end function
'=====================================================
'=================异或操作============================
'=====================================================
function mxor(chrb1,chrb2)
        if chrb1 and chrb2 then
        mxor=chrb(ascb(chrb1) xor ascb(chrb2))
        end if       
end function
function strlength(str)
        on error resume next
        dim winnt_chinese
        winnt_chinese    = (len(中国)=2)
        if winnt_chinese then
                dim l,t,c
                dim i
                l=len(str)
                t=l
                for i=1 to l
                        c=asc(mid(str,i,1))
                        if c                        if c>255 then
                                t=t+1
                        end if
                next
                strlength=t
        else
                strlength=len(str)
        end if
        if err.number0 then err.clear
end function
%>
2.文件 login.asp
'asp的整合方法已更新,,中文注册乱码问题已解决
'================================================================
'=====================用法示例==疑问加我qq:2666556===============
'================================================================
dim passportkey,youraspweb_url,discuzbbs_url
passportkey=1234567890  '这里换成你discuz论坛通行证设置的passportkey
youraspweb_url=http://localhost/test2/login.asp  '这里换成你的主页绝对地址或相对地址
discuzbbs_url=http://localhost:8080/discuz/          '这里换成你的discuz论坛绝对地址或相对地址
select case request.querystring(act)
        case login   call login()
        case logout  call logout()
end select
if request.cookies(username) then
        dim str
        str=request.cookies(username) & 你好 你已登陆成功 &_
    点击这里退出登陆 &_
    点击这里访问论坛
response.write(str)
end if
function logout()
        dim auth,forward,verify
        auth=request.cookies(auth)       
        response.cookies(username)=
        response.cookies(auth)=       
        forward=request.querystring(forward)
        if forward= then forward=youraspweb_url                                         
        verify = md5(logout& auth & forward & passportkey ,32)
        auth=server.urlencode(auth)
        forward=server.urlencode(forward)
        response.redirect(discuzbbs_url & api/passport.php?action=logout&auth= & auth & &forward= & forward & &verify= & verify)
end function
function login()
        dim auth,forward,verify,member_info
        '需根据实际情况修改,这里只作最简单的验证
        if request.form(username)=admin and request.form(password)=123456 then
                '设置自己的cookie 或 session
                response.cookies(username)=request.form(username)
'========================================================
                '===============passport 整合开始========================
                '========================================================
                '假设从用户数据库里取出email 为abc@hotmail.com
                member_info=time=  & datediff(s,1970-1-1 00:00:00,now) &_
                                                        &username= & request.form(username) &_
                                                        &password= & md5(request.form(password),32) &_
                                                        &email=    & abc@hotmail.com 
                auth = passport_encrypt(member_info , passportkey)               
                response.cookies(auth)=auth
                forward=request.form(forward)
                if forward= then forward=youraspweb_url       
                verify = md5(login & auth & forward & passportkey,32)
                auth=server.urlencode(auth)
                forward=server.urlencode(forward)       
                response.redirect(discuzbbs_url & api/passport.php?action=login&auth= & auth & &forward= & forward & &verify= & verify)                       
                '========================================================
                '===============passport 整合结束========================
                '========================================================
else
                        response.write(登陆失败
)
        end if
end function
%>
用户名:
密 码:
/tech/uploadfile/200702/20070227024221846.rar
第四篇 :asp整合实例-powereasy2006 sp2普及版 与 discuz v4.10的整合
powereasy下载地址:http://www.powereasy.net/soft/pe_soft/181.html
步骤1:
        下载安装powereasy,下载安装discuz v4.10
步骤2:
        将user_chklogin.asp 覆盖到 powereasy安装根目录/user/user_chklogin.asp
        将user_logout.asp   覆盖到 powereasy安装根目录/user/user_logout.asp
        将user_regpost.asp  覆盖到 powereasy安装根目录/reg/user_regpost.asp
        拷贝discuz_passport文件夹到powereasy安装根目录
步骤3:  修改discuz_passport里的config.asp文件部分变量
        discuz_passportkey=1234567890                  '这里换成你discuz论坛通行证设置的passportkey
        discuz_youraspweb_url=http://localhost:8080/  '这里换成你的主页绝对地址或相对地址
        discuz_bbs_url=http://localhost/discuz/       '这里换成你的discuz论坛绝对地址或相对地址
步骤4:
        到discuz论坛后台通行证设置开启通行证
        启用通行证:                 是
        应用程序 url 地址:         http://localhost:8080/        '这里换成你的主页绝对地址或相对地址
        通行证私有密匙:         1234567890                '这里必须与discuz_passportkey的值相同
        验证字串有效期(秒):        3600
        应用程序注册地址:        reg/user_reg.asp
        应用程序登录地址:        index.asp
        应用程序退出地址:        user/user_logout.asp
        具体请参照论坛设置图片
第五篇 主站与discuz同服务器无需passport的整合方法
$value) {
        setcookie($key,'',time() - 3600,$cookiepath,$cookiedomain,0);            
            header(location:.$_server['php_self']);         
    }
}
if(isset($_post[submit])){//检查是否点击了提交按钮
    $username=trim($_post['username']);
    $pwd=trim($_post['password']);
    //主站验证登陆,为简单起见,这里只作简单的示范
    if($username==$check_username && $pwd==$check_password){//测试时这个用户名必须在论坛里也存在
        $db = new dbstuff;
        $db->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect);//$dbhost,$dbuser,$dbpw,$dbname,$pconnect是在bbs/config.inc.php里定义的变量
        $sql=select * from {$tablepre}members where username='$username';
        $rs = $db->query($sql);
        if($dzmember = $db->fetch_array($rs)){
            setcookie('myusername',$username,time()+3600,$cookiepath,$cookiedomain,0);//设置主站自身的cookie
            setcookie({$tablepre}sid,'',time() - 3600,$cookiepath,$cookiedomain,0);//让discuz的sid过期是为了让discuz重新分配一个新的sid
            setcookie({$tablepre}auth, authcode($dzmember[password]\t$dzmember[secques]\t$dzmember[uid], 'encode'),time()+3600,$cookiepath,$cookiedomain,0);//$cookiepath和$cookiedomainbbs/config.inc.php里定义的变量
            header(location:.$_server['request_uri']);
        }
    }
}
//下面这个函数是discuz的用户cookie编码函数,已修改,原型在$path_bbs/include/global.func.php
function authcode($string, $operation) {
    global $_server, $_dcache,$path_bbs;
    require_once $path_bbs/forumdata/cache/cache_settings.php;//需要获取论坛的authkey
    $discuz_auth_key = md5($_dcache['settings']['authkey'].$_server['http_user_agent']);
    $coded = '';
    $keylength = strlen($discuz_auth_key);
    $string = $operation == 'decode' ? base64_decode($string) : $string;
    for($i = 0; $i         $coded .= substr($string, $i, $keylength) ^ $discuz_auth_key;
    }
    $coded = $operation == 'encode' ? str_replace('=', '', base64_encode($coded)) : $coded;
    return $coded;
}
?>
用户名:测试用户名为admin,请更改为你的用户名
密码:测试密码为123456
第六篇 c#与discuz5.0的整合实例using system;
using system.security.cryptography;
using system.text;
///
/// c#与discuz的passport整合事例
/// 请保留以下信息以备出现问题时使用
/// 整合贡献:huozhe3136 qq:2666556
/// 调试工具:microsoft visual web developer 2005
///
public partial class _default : system.web.ui.page {
    //------------------------需要修改的设置---------------------------------
    string weburl           = http://localhost:1627/webapp/default.aspx;//这里修改为你的测试主站的地址,不要缺少最后的'/'号
    string dzurl            = http://localhost:8080/discuz/;//这里修改为你的dz地址,不要缺少最后的'/'号
    string dzpassportkey    = 1234567890;//这里修改为你的dz后台通行证设置里的possportkey
    string dzforward        = ;
    string dzauth           = ;
    string dzverify         = ;
protected void page_load(object sender, eventargs e){
        dzforward = request.querystring[forward];
        if (request.querystring[act] == logout) logout();
        if(session[username]!=null) response.write(session[username].tostring()+ 登陆成功! 点击这里退出登陆 访问论坛
);
    }
    protected void logout(){
        session[username] = null;
        dzforward           = request.querystring[forward];//获取返回地址
        if (dzforward == ) dzforward = weburl;//如果返回地址为空,则返回设置的页
        dzverify            = md5(logout + dzforward + dzpassportkey);
        dzforward           = server.urlencode(dzforward);
        response.redirect(dzurl + api/passport.php?action=logout&auth=&forward= + dzforward + &verify= + dzverify);
}
protected void button1_click(object sender, eventargs e){
        string postusername;
        string postpwd;
        postusername        = username.text.tostring().trim();
        postpwd             = password.text.tostring();
        if(postusername==admin && postpwd==123456){
            session[username]=postusername;//设置主站自身的cookie或session;
            //---------------------------passport注册或登陆整合开始-----------------------------
            string memberinfo = username= + postusername
                        + &password= + md5(postpwd)
                        + &time=+ time()//获取当前时间与格林威治的秒差
                        + &email=+abc@abc.com;//需要email的值,实际整合通常情况是从数据库里获取用户email
            dzauth          = passport_encrypt(memberinfo , dzpassportkey);
            dzforward       = forward.value.tostring().trim();//获取返回地址
            if(dzforward==) dzforward = weburl;//如果返回地址为空,则返回设置的页
            dzverify        = md5(login + dzauth + dzforward + dzpassportkey);
            dzauth          = server.urlencode(dzauth);
            dzforward       = server.urlencode(dzforward);
            response.redirect(dzurl + api/passport.php?action=login&auth= + dzauth + &forward= + dzforward + &verify= + dzverify);
            //---------------------------passport注册或登陆整合结束-----------------------------
        }else response.write(登陆失败
);
    }
//------------------------------------以下为一些关键函数------------------------------
    // 将字符串转换为byte数组    
    public byte[] strtobyteary(string str){
        return encoding.default.getbytes(str);
    }
// c# dz通信证编码函数
   public string passport_encrypt(string txt, string key){
        byte[] randomnumber = new byte[1];
        rngcryptoserviceprovider gen = new rngcryptoserviceprovider();
        gen.getbytes(randomnumber);
        int rand = convert.toint32(randomnumber[0]);
        string encrypt_key = md5(rand.tostring());
        byte[] txtary = strtobyteary(txt);
        byte[] encryary = strtobyteary(encrypt_key);
        int j = 0;
        int ctr = 0;
        byte[] tmp = new byte[2 * txtary.length];
        for (int i = 0; i         {
            ctr = ctr == encryary.length ? 0 : ctr;
            tmp[j++] = encryary[ctr];
            tmp[j++] = xor(txtary[i], encryary[ctr++]);
        }
        return convert.tobase64string(passport_key(tmp, key));
    }
// c# dz通行证解码函数
    public string passport_decrypt(string txt, string key){
        byte[] t = convert.frombase64string(txt);
        byte[] btxt = passport_key(t, key);
        byte[] btmp = new byte[btxt.length];
        int j = 0;
        for (int i = 0; i             btmp[j] = xor(btxt[i], btxt[++i]);
        return encoding.default.getstring(btmp);
    }
// c# dz通行证密匙处理函数   
    public byte[] passport_key(byte[] btxt, string key){
        key = md5(key);
        byte[] keyary = strtobyteary(key);
        int ctr = 0;
        byte[] tmp = new byte[btxt.length];
        for (int i = 0; i             ctr = (ctr == keyary.length) ? 0 : ctr;
            tmp[i] = xor(btxt[i], keyary[ctr++]);
        }
        return tmp;
    }
// 针对byte的异或    
    public byte xor(byte a, byte b){
        return convert.tobyte(a ^ b);
    }
// 获取unix时间戳   
    public string time(){
        datetime dtstart = timezone.currenttimezone.tolocaltime(new datetime(1970, 1, 1));
        datetime dtnow = datetime.parse(datetime.now.tostring());
        timespan tonow = dtnow.subtract(dtstart);
        string timestamp = tonow.ticks.tostring();
        timestamp = timestamp.substring(0, timestamp.length - 7);
        return timestamp;
    }
// md5加密
    public string md5(string str){
        md5 md5hasher = md5.create();
        string re=;
        byte[] data = md5hasher.computehash(encoding.default.getbytes(str));
        for (int i = 0; i             re += data[i].tostring(x2);       
        return re;
    }
}
/tech/uploadfile/200702/20://www.tenwe.com/tech/uploadfile/200702/20070227024435342.rar target=_blank>/tech/uploadfile/200702/20070227024435342.rar
070227024435342.rar
http://www.bkjia.com/phpjc/318821.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/318821.htmltecharticle解决办法: 第一步: 到dz的数据库表cdb_settings 找到下面这几行修改为 第二步: 删除dz安装目录/forumdata/cache/cache_settings.php 第三步: 重新访问论...
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product