解决办法:
第一步: 到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
<?php
//该文档保存为login.php
//首先将接口技术文档里的加密解密函数拷贝
//为了不让代码太乱,我拷贝到文档的结尾处
//假设自己的用户数据库表里用户名字段为username, 密码字段为pwd, email字段为 email
//注册页实现方法差不多,可自行实现,疑问加我qq:2666556
$act=(isset($_get['act']))?$_get['act']:"login";
if(function_exists($act)) $act();else login();
function login()
{
$errmsg=usercheck();
if($errmsg!="")echo $errmsg;
//后面加上显示你的登陆表单的代码 如
?>
<form action=login.php?act=login method=post>
用户名:<input name=username>
密码:<input name=password>
<input name=submit type=submit value=登陆></form>
<?php
}//end function
function logout()//登出
{
$passportkey="1234567890";//这里换成你论坛通行证设置的passportkey
$auth=$_cookie['auth'];
setcookie("auth", "",time() - 3600);
$forward=$_get['forward'];
if($forward=="")$forward="../../index.php";//这里换成你的主页绝对地址或相对地址
$verify = md5('logout'.$auth.$forward.$passportkey);
$auth=rawurlencode($auth);
$forward=rawurlencode($forward);
header("location: bbs/api/passport.php?action=logout&auth=$auth&forward=$forward&verify=$verify");
}
function usercheck()
{
$passportkey="1234567890";//这里换成你论坛通行证设置的passportkey
//===========验证输入=====================
if(!isset($_post['submit'])) return; // login表单的按钮需要与此同名
$usnm=$_post['username'];//username换成你登陆表单里的用户名域
$pwd=$_post['password'];//password换成你登陆表单里的密码域
if($usnm=="") return "请输入用户名!";
if($pwd=="") return "请输入密码!";
//=========数据库处理==========================
$db=mysql_connect("localhost", "root", "");
mysql_select_db("your_db_name");
$sql="select * from `user` where username='".$usnm."' limit 1";
$rs = mysql_query($sql,$db) ;
$row = mysql_fetch_array($rs);
if(!$row)return "该用户不存在";
if($row["pwd"]!=md5($pwd))return "密码错误";
mysql_free_result($rs);
//==============header到bbs=====================
$member = array
(
'time' => 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 < strlen($txt); $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 < strlen($txt); $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 < strlen($txt); $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<0 then c=c+65536
if c>255 then
t=t+1
end if
next
strlength=t
else
strlength=len(str)
end if
if err.number<>0 then err.clear
end function
%>
2.文件 login.asp
<!--#include file="md5.asp"-->
<!--#include file="base64.asp"-->
<!--#include file="discuz_passport.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") & " 你好 你已登陆成功" &_
" <a href=""t3.asp?act=logout"">点击这里退出登陆</a>" &_
" <a href="""& discuzbbs_url & """>点击这里访问论坛</a><br>"
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("登陆失败<br>")
end if
end function
%>
<form name="form1" method="post" action="login.asp?act=login">
用户名:
<input type="text" name="username">
<br>
密 码:
<input type="password" name="password">
<br>
<input type="hidden" name="forward" value="<%=request.querystring("forward")%>">
<input type="submit" name="submit" value=" 登 陆 ">
</form>
/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的整合方法
<?php
//discuz同服务器下无passport登陆整合方法
//贡献:huozhe3136 qq:2666556
//假设discuz安装在网站根目录下的bbs/中
//用法事例
error_reporting(e_all);
$path_bbs="bbs/";//请修改为你的论坛的相对路径
$check_username="admin";//测试时这个用户名必须在论坛里也存在
$check_password="123456";
define('in_discuz', true);//为了包含discuz下的文件这个必须定义
require_once "$path_bbs/config.inc.php";//获得论坛数据库的配置
require_once "$path_bbs/include/db_mysql.class.php";
if(@$_get[act]=="logout"){
foreach ($_cookie as $key => $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 < strlen($string); $i += $keylength) {
$coded .= substr($string, $i, $keylength) ^ $discuz_auth_key;
}
$coded = $operation == 'encode' ? str_replace('=', '', base64_encode($coded)) : $coded;
return $coded;
}
?>
<?php
if(@$_cookie['myusername']==''){
?>
<form action="" method="post">
用户名:<input name="username">测试用户名为admin,请更改为你的用户名<br>
密码:<input type="password" name="password">测试密码为123456<br>
<input type="submit" name="submit" value="测试">
</form>
<?php
}
else echo("登陆成功,<a href='{$path_bbs}index.php' target=_blank>请到论坛检查登陆</a><br><a href='?act=logout'>退出登陆</a> ");
?>
第六篇 c#与discuz5.0的整合实例
using system;
using system.security.cryptography;
using system.text;
/// <summary>
/// c#与discuz的passport整合事例
/// 请保留以下信息以备出现问题时使用
/// 整合贡献:huozhe3136 qq:2666556
/// 调试工具:microsoft visual web developer 2005
/// </summary>
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()+ "登陆成功! <a href="default.aspx?act=logout">点击这里退出登陆</a> <a href="+dzurl+" target=_blank>访问论坛</a><br>");
}
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("登陆失败<br>");
}
//------------------------------------以下为一些关键函数------------------------------
// 将字符串转换为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 < txtary.length; 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 < btxt.length; i++, j++)
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 < btxt.length; 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 < data.length; 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【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:)!