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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

Passport 通行证 整合

[复制链接]
huozhe3136 发表于 2006-5-27 12:07:36 | 显示全部楼层 |阅读模式
第一篇:整合原理

请注意: 整合不成功可能造成的后果-----dz论坛无法登录,无法管理
解决办法:
第一步: 到dz的数据库表cdb_settings 找到下面这几行修改为

第二步: 删除dz安装目录/forumdata/cache/cache_settings.php
第三步: 重新访问论坛



登陆和注册整合流程
用户从登陆或注册表单提交帐号密码信息 ==>
主站程序检验用户登陆或注册,成功(注册需要生成新用户)则 ==>
设置主站自身的cookie或session    ==>
url传递 返回地址forward和编码后的用户信息和其他信息 到dz/api/passport.php


整合之前请先仔细阅读官方passport技术文档: https://discuz.dismall.com/usersguide/advanced_passport.htm


  1. <?php
  2. //该文档保存为login.php
  3. //首先将接口技术文档里的加密解密函数拷贝
  4. //为了不让代码太乱,我拷贝到文档的结尾处
  5. //假设自己的用户数据库表里用户名字段为UserName, 密码字段为Pwd, Email字段为 Email
  6. //注册页实现方法差不多,可自行实现,疑问加我QQ:2666556

  7. $act=(isset($_GET['act']))?$_GET['act']:"login";
  8. if(function_exists($act)) $act();else login();        

  9. function login()
  10. {        
  11.         $ErrMsg=UserCheck();
  12.         if($ErrMsg!="")echo $ErrMsg;        
  13.         //后面加上显示你的登陆表单的代码 如
  14. ?>
  15. <form action=login.php?act=login method=post>
  16. 用户名:<input name=username>
  17. 密码:<input name=password>
  18. <input name=submit type=submit value=登陆></form>
  19. <?php

  20. }//end function

  21. function logout()//登出
  22. {
  23.         $passportkey="1234567890";//这里换成你论坛通行证设置的passportkey
  24.         $auth=$_COOKIE['auth'];
  25.         setcookie("auth", "",time() - 3600);
  26.         $forward=$_GET['forward'];
  27.         if($forward=="")$forward="../../index.php";//这里换成你的主页绝对地址或相对地址                                       
  28.         $verify = md5('logout'.$auth.$forward.$passportkey);
  29.         $auth=rawurlencode($auth);
  30.         $forward=rawurlencode($forward);
  31.         header("Location: bbs/api/passport.php?action=logout&auth=$auth&forward=$forward&verify=$verify");
  32. }

  33. function UserCheck()
  34. {        
  35.         $passportkey="1234567890";//这里换成你论坛通行证设置的passportkey
  36.        
  37.         //===========验证输入=====================
  38.         if(!isset($_POST['submit'])) return; // login表单的按钮需要与此同名
  39.         $usnm=$_POST['username'];//username换成你登陆表单里的用户名域                        
  40.         $pwd=$_POST['password'];//password换成你登陆表单里的密码域                        
  41.         if($usnm=="") return "请输入用户名!";
  42.         if($pwd=="") return "请输入密码!";
  43.        
  44.         //=========数据库处理==========================
  45.         $db=mysql_connect("localhost", "root", "");
  46.         mysql_select_db("your_db_name");
  47. $sql="Select * from `user` where UserName='".$usnm."' Limit 1";        
  48.         $rs = mysql_query($sql,$db)        ;
  49.         $row = mysql_fetch_array($rs);
  50.         if(!$row)return "该用户不存在";
  51.         if($row["Pwd"]!=md5($pwd))return "密码错误";
  52.         mysql_free_result($rs);        
  53.        
  54.         //==============header到bbs=====================        
  55.         $member = array
  56.         (
  57.                         'time'     => time(),
  58.                         'username' => $row["UserName"],
  59.                         'password' => $row["Pwd"],
  60.                         'email'    => $row["Email"]
  61.         );
  62.         $auth = passport_encrypt(passport_encode($member), $passportkey);
  63.         setcookie("auth",$auth,($_POST["Cookie"]? time()+(int)$_POST["Cookie"] :0));
  64.         $forward=$_POST['forward'];
  65.         if($forward=="")$forward="../../index.php";                                       
  66.         $verify = md5('login'.$auth.$forward.$passportkey);
  67.         $auth=rawurlencode($auth);
  68.         $forward=rawurlencode($forward);
  69.         header("Location: bbs/api/passport.php?action=login&auth=$auth&forward=$forward&verify=$verify");                        

  70. }


  71. //=============================================================
  72. //=============以下为拷贝过来的函数============================
  73. function passport_encrypt($txt, $key) {
  74.         srand((double)microtime() * 1000000);
  75.         $encrypt_key = md5(rand(0, 32000));        
  76.         $ctr = 0;
  77.         $tmp = '';
  78.         for($i = 0; $i < strlen($txt); $i++) {
  79.                         $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
  80.                         $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
  81.         }
  82.         return base64_encode(passport_key($tmp, $key));
  83. }

  84. function passport_decrypt($txt, $key) {
  85.         $txt = passport_key(base64_decode($txt), $key);
  86.         $tmp = '';
  87.         for ($i = 0; $i < strlen($txt); $i++) {
  88.                  $tmp .= $txt[$i] ^ $txt[++$i];
  89.         }
  90.         return $tmp;
  91. }

  92. function passport_key($txt, $encrypt_key) {
  93.         $encrypt_key = md5($encrypt_key);
  94.         $ctr = 0;
  95.         $tmp = '';
  96.         for($i = 0; $i < strlen($txt); $i++) {
  97.                         $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
  98.                         $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
  99.         }
  100.         return $tmp;
  101. }

  102. function passport_encode($array) {
  103.         $arrayenc = array();
  104.         foreach($array as $key => $val) {
  105.                    $arrayenc[] = $key.'='.urlencode($val);
  106.         }
  107.         return implode('&', $arrayenc);

  108. }
  109. //=========================================================================
  110. //===========================拷贝结束======================================
  111. ?>
复制代码




第二篇: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 (提供整合效果的演示)
//视频贡献: 一热心网友
//关于整合的更多内容请访问https://discuz.dismall.com/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


第三篇: asp程序与discuz v4.10的整合方法
1.文件discuz_passport.asp

  1. <%
  2. '请保留以下信息以备出现问题时使用
  3. '贡献者 huozhe3136 QQ:2666556
  4. '=====================================================
  5. '============仿discuz passport编码函数================
  6. '=====================================================

  7. function passport_encrypt(txt, key)
  8.                 dim encrypt_key, encrypt_key_ary,txt_ary
  9.                 dim ctr,tmp,i      
  10.         Randomize
  11.                 encrypt_key=md5(Int(32000* Rnd),32)
  12.                 encrypt_key_ary=strtoary(encrypt_key)               
  13.         txt_ary=strtoary(txt)      
  14.         ctr = 0
  15.         tmp = ""               
  16.         for i = 0 to StrLength(txt)-1
  17.                         if ctr=len(encrypt_key)  then         ctr=0  else ctr=ctr                               
  18.             tmp = tmp & encrypt_key_Ary(ctr) &  mxor(txt_ary(i),encrypt_key_ary(ctr))
  19.             ctr=ctr+1                                                    
  20.         next
  21.                 passport_encrypt=strAnsi2Unicode(base64Encode(passport_key(tmp, key)))               
  22. end function


  23. '=====================================================
  24. '============仿discuz passport解码函数================
  25. '=====================================================
  26. function passport_decrypt(txt, key)
  27.                 Dim txt_ary,tmp,i               
  28.                 txt = passport_key(base64Decode(strUnicode2Ansi(txt)), key)
  29.                 txt_ary = AnsiToAry(txt)
  30.         ' 变量初始化
  31.                 tmp = ""
  32.         for i = 0 To lenb(txt)-1
  33.                   tmp = tmp & mxor(txt_ary(i),txt_ary(i+1))
  34.                   i=i+1
  35.                 next
  36.                 passport_decrypt = strAnsi2Unicode(tmp)
  37. end function  

  38. '=====================================================
  39. '==========仿discuz Passport 密匙处理函数=============
  40. '=====================================================
  41. function passport_key(ansitxt, encrypt_key)
  42.                 dim encrypt_key_tmp,encrypt_key_ary,txt_ary
  43.                 dim ctr,tmp,i
  44.                 encrypt_key_tmp = md5(encrypt_key,32)               
  45.         encrypt_key_ary=StrToAry(encrypt_key_tmp)               
  46.                 txt_ary=AnsiToAry(ansitxt)                
  47.                 ctr = 0
  48.         tmp = ""                  
  49.         for i=0 to lenb(ansitxt)-1                       
  50.                     if ctr=len(encrypt_key_tmp) then ctr=0 else ctr=ctr
  51.             tmp= tmp & mxor(txt_ary(i),encrypt_key_ary(ctr))
  52.             ctr=ctr+1
  53.         next
  54.                 passport_key=tmp               
  55. end function

  56. '=====================================================
  57. '=================将字符串转换为Ansi数组==============
  58. '=====================================================
  59. function StrToAry(str)
  60.    dim ary(),length,tmpstr,i
  61.    tmpstr=strUnicode2Ansi(str)
  62.    length=lenb(tmpstr)   
  63.    redim ary(length)   
  64.    for i=0 to length-1                                    
  65.                 ary(i)=midb(tmpstr,i+1,1)               
  66.    next  
  67.    StrToAry=ary
  68. end function

  69. '=====================================================
  70. '=================将Ansi字符串转换为Ansi数组==========
  71. '=====================================================
  72. function AnsiToAry(str)
  73.    dim ary(),length,i
  74.    length=lenb(str)   
  75.    redim ary(length)   
  76.    for i=0 to length-1                                    
  77.                 ary(i)=midb(str,i+1,1)               
  78.    next  
  79.    AnsiToAry=ary
  80. end function


  81. '=====================================================
  82. '=================异或操作============================
  83. '=====================================================
  84. function mxor(chrb1,chrb2)
  85.         if chrb1<>"" and chrb2 <>"" then
  86.         mxor=chrb(ascb(chrb1) xor ascb(chrb2))
  87.         end if       
  88. end function


  89. Function StrLength(str)
  90.         ON ERROR RESUME NEXT
  91.         Dim WINNT_CHINESE
  92.         WINNT_CHINESE    = (len("中国")=2)
  93.         If WINNT_CHINESE Then
  94.                 Dim l,t,c
  95.                 Dim i
  96.                 l=len(str)
  97.                 t=l
  98.                 For i=1 To l
  99.                         c=asc(mid(str,i,1))
  100.                         If c<0 Then c=c+65536
  101.                         If c>255 Then
  102.                                 t=t+1
  103.                         End If
  104.                 Next
  105.                 strLength=t
  106.         Else
  107.                 strLength=len(str)
  108.         End If
  109.         If err.number<>0 Then err.clear
  110. End Function

  111. %>
复制代码


2.文件 login.asp

  1. <!--#include file="md5.asp"-->
  2. <!--#include file="base64.asp"-->
  3. <!--#include file="discuz_passport.asp"-->
  4. <%
  5. 'asp的整合方法已更新,,中文注册乱码问题已解决
  6. '================================================================
  7. '=====================用法示例==疑问加我QQ:2666556===============
  8. '================================================================
  9. dim PassportKey,YourAspWeb_Url,DiscuzBbs_Url
  10. PassportKey="1234567890"  '这里换成你discuz论坛通行证设置的passportkey
  11. YourAspWeb_Url="http://localhost/test2/login.asp"  '这里换成你的主页绝对地址或相对地址
  12. DiscuzBbs_Url="http://localhost:8080/discuz/"          '这里换成你的discuz论坛绝对地址或相对地址

  13. select case request.QueryString("act")
  14.         case "login"   call login()
  15.         case "logout"  call logout()
  16. end select

  17. if request.Cookies("username")<>"" then
  18.         dim str
  19.         str=request.Cookies("username") & " 你好 你已登陆成功" &_
  20.     " <a href=""t3.asp?act=logout"">点击这里退出登陆</a>" &_
  21.     " <a href="""& DiscuzBbs_Url & """>点击这里访问论坛</a><br>"
  22.     response.Write(str)
  23. end if

  24. function logout()
  25.         dim auth,forward,verify
  26.         auth=request.Cookies("auth")        
  27.         response.Cookies("username")=""
  28.         response.Cookies("auth")=""        
  29.         forward=request.QueryString("forward")
  30.         if forward="" then forward=YourAspWeb_Url                                          
  31.         verify = md5("logout"& auth & forward & PassportKey ,32)
  32.         auth=server.URLEncode(auth)
  33.         forward=server.URLEncode(forward)
  34.         response.Redirect(DiscuzBbs_Url & "api/passport.php?action=logout&auth=" & auth & "&forward=" & forward & "&verify=" & verify)
  35. end function



  36. function login()
  37.         dim auth,forward,verify,member_info
  38.         '需根据实际情况修改,这里只作最简单的验证
  39.         if request.Form("username")="admin" and request.Form("password")="123456" then
  40.                 '设置自己的cookie 或 session
  41.                 response.Cookies("username")=request.Form("username")
  42.                
  43.                 '========================================================
  44.                 '===============passport 整合开始========================
  45.                 '========================================================
  46.                 '假设从用户数据库里取出email 为abc@hotmail.com
  47.                 member_info="time="  & datediff("s","1970-1-1 00:00:00",now) &_
  48.                                                         "&username=" & request.Form("username") &_
  49.                                                         "&password=" & md5(request.Form("password"),32) &_
  50.                                                         "&email="    & "abc@hotmail.com"  
  51.                 auth = passport_encrypt(member_info , PassportKey)               
  52.                 response.Cookies("auth")=auth
  53.                 forward=request.form("forward")
  54.                 if forward="" then forward=YourAspWeb_Url        
  55.                 verify = md5("login" & auth & forward & PassportKey,32)
  56.                 auth=server.URLEncode(auth)
  57.                 forward=server.URLEncode(forward)        
  58.                 response.Redirect(DiscuzBbs_Url & "api/passport.php?action=login&auth=" & auth & "&forward=" & forward & "&verify=" & verify)                        
  59.                 '========================================================
  60.                 '===============passport 整合结束========================
  61.                 '========================================================
  62.                                        
  63.         else
  64.                         response.Write("登陆失败<br>")
  65.         end if
  66. end function

  67. %>
  68. <form name="form1" method="post" action="login.asp?act=login">
  69.   用户名:
  70.   <input type="text" name="username">
  71.   <br>
  72.   密 码:
  73.   <input type="password" name="password">
  74.   <br>
  75.   <input type="hidden" name="forward" value="<%=request.QueryString("forward")%>">    
  76.   <input type="submit" name="Submit" value=" 登 陆 ">
  77. </form>

复制代码



第四篇 :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的整合方法

  1. <?php
  2. //discuz同服务器下无passport登陆整合方法
  3. //贡献:huozhe3136 QQ:2666556
  4. //假设discuz安装在网站根目录下的bbs/中
  5. //用法事例
  6. error_reporting(E_ALL);

  7. $path_bbs="bbs/";//请修改为你的论坛的相对路径
  8. $check_username="admin";//测试时这个用户名必须在论坛里也存在
  9. $check_password="123456";
  10. define('IN_DISCUZ', TRUE);//为了包含discuz下的文件这个必须定义
  11. require_once "$path_bbs/config.inc.php";//获得论坛数据库的配置
  12. require_once "$path_bbs/include/db_mysql.class.php";

  13. if(@$_GET[act]=="logout"){
  14.     foreach ($_COOKIE as $key => $value) {
  15.         setcookie($key,'',time() - 3600,$cookiepath,$cookiedomain,0);             
  16.             header("Location:".$_SERVER['PHP_SELF']);         
  17.     }
  18. }
  19. if(isset($_POST["submit"])){//检查是否点击了提交按钮
  20.     $username=trim($_POST['username']);
  21.     $pwd=trim($_POST['password']);
  22.     //主站验证登陆,为简单起见,这里只作简单的示范
  23.     if($username==$check_username && $pwd==$check_password){//测试时这个用户名必须在论坛里也存在
  24.         $db = new dbstuff;
  25.         $db->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect);//$dbhost,$dbuser,$dbpw,$dbname,$pconnect是在bbs/config.inc.php里定义的变量
  26.         $sql="select * from {$tablepre}members where username='$username'";
  27.         $rs = $db->query($sql);
  28.         if($dzmember = $db->fetch_array($rs)){
  29.             setcookie('myusername',$username,time()+3600,$cookiepath,$cookiedomain,0);//设置主站自身的cookie
  30.             setcookie("{$tablepre}sid",'',time() - 3600,$cookiepath,$cookiedomain,0);//让discuz的sid过期是为了让discuz重新分配一个新的sid
  31.             setcookie("{$tablepre}auth", authcode("$dzmember[password]\t$dzmember[secques]\t$dzmember[uid]", 'ENCODE'),time()+3600,$cookiepath,$cookiedomain,0);//$cookiepath和$cookiedomainbbs/config.inc.php里定义的变量
  32.             header("Location:".$_SERVER['REQUEST_URI']);
  33.         }
  34.     }
  35. }

  36. //下面这个函数是discuz的用户cookie编码函数,已修改,原型在$path_bbs/include/global.func.php
  37. function authcode($string, $operation) {
  38.     global $_SERVER, $_DCACHE,$path_bbs;
  39.     require_once "$path_bbs/forumdata/cache/cache_settings.php";//需要获取论坛的authkey
  40.     $discuz_auth_key = md5($_DCACHE['settings']['authkey'].$_SERVER['HTTP_USER_AGENT']);
  41.     $coded = '';
  42.     $keylength = strlen($discuz_auth_key);
  43.     $string = $operation == 'DECODE' ? base64_decode($string) : $string;
  44.     for($i = 0; $i < strlen($string); $i += $keylength) {
  45.         $coded .= substr($string, $i, $keylength) ^ $discuz_auth_key;
  46.     }
  47.     $coded = $operation == 'ENCODE' ? str_replace('=', '', base64_encode($coded)) : $coded;
  48.     return $coded;
  49. }
  50. ?>
  51. <?php
  52. if(@$_COOKIE['myusername']==''){
  53. ?>
  54. <form action="" method="POST">
  55. 用户名:<input name="username">测试用户名为admin,请更改为你的用户名<br>
  56. 密码:<input type="password" name="password">测试密码为123456<br>
  57. <input type="submit" name="submit" value="测试">
  58. </form>
  59. <?php
  60. }
  61. else echo("登陆成功,<a href='{$path_bbs}index.php' target=_blank>请到论坛检查登陆</a><br><a href='?act=logout'>退出登陆</a> ");
  62. ?>
复制代码



第六篇 C#与discuz5.0的整合实例

  1. using System;
  2. using System.Security.Cryptography;
  3. using System.Text;

  4. /// <summary>
  5. /// c#与discuz的passport整合事例
  6. /// 请保留以下信息以备出现问题时使用
  7. /// 整合贡献:huozhe3136 QQ:2666556
  8. /// 调试工具:Microsoft Visual Web Developer 2005
  9. /// </summary>
  10. public partial class _Default : System.Web.UI.Page {
  11.     //------------------------需要修改的设置---------------------------------
  12.     string webUrl           = "http://localhost:1627/webapp/Default.aspx";//这里修改为你的测试主站的地址,不要缺少最后的'/'号
  13.     string dzUrl            = "http://localhost:8080/discuz/";//这里修改为你的dz地址,不要缺少最后的'/'号
  14.     string dzPassportKey    = "1234567890";//这里修改为你的dz后台通行证设置里的possportkey
  15.     string dzForward        = "";
  16.     string dzAuth           = "";
  17.     string dzVerify         = "";



  18.     protected void Page_Load(object sender, EventArgs e){
  19.         dzForward = Request.QueryString["forward"];
  20.         if (Request.QueryString["act"] == "logout") logout();
  21.         if(Session["username"]!=null) Response.Write(Session["username"].ToString()+ "登陆成功! <a href="default.aspx?act=logout">点击这里退出登陆</a> <a href="+dzUrl+" target=_blank>访问论坛</a><br>");
  22.     }

  23.     protected void logout(){
  24.         Session["username"] = null;
  25.         dzForward           = Request.QueryString["forward"];//获取返回地址
  26.         if (dzForward == "") dzForward = webUrl;//如果返回地址为空,则返回设置的页
  27.         dzVerify            = md5("logout" + dzForward + dzPassportKey);
  28.         dzForward           = Server.UrlEncode(dzForward);
  29.         Response.Redirect(dzUrl + "api/passport.php?action=logout&auth=&forward=" + dzForward + "&verify=" + dzVerify);
  30.             
  31.     }


  32.     protected void Button1_Click(object sender, EventArgs e){
  33.         string postUsername;
  34.         string postPwd;
  35.         postUsername        = username.Text.ToString().Trim();
  36.         postPwd             = password.Text.ToString();

  37.         if(postUsername=="admin" && postPwd=="123456"){
  38.             Session["username"]=postUsername;//设置主站自身的cookie或session;

  39.             //---------------------------passport注册或登陆整合开始-----------------------------
  40.             string memberInfo = "username=" + postUsername
  41.                         + "&password=" + md5(postPwd)
  42.                         + "&time="+ time()//获取当前时间与格林威治的秒差
  43.                         + "&email="+"abc@abc.com";//需要email的值,实际整合通常情况是从数据库里获取用户email
  44.             dzAuth          = passport_encrypt(memberInfo , dzPassportKey);
  45.             dzForward       = forward.Value.ToString().Trim();//获取返回地址
  46.             if(dzForward=="") dzForward = webUrl;//如果返回地址为空,则返回设置的页
  47.             dzVerify        = md5("login" + dzAuth + dzForward + dzPassportKey);
  48.             dzAuth          = Server.UrlEncode(dzAuth);
  49.             dzForward       = Server.UrlEncode(dzForward);
  50.             Response.Redirect(dzUrl + "api/passport.php?action=login&auth=" + dzAuth + "&forward=" + dzForward + "&verify=" + dzVerify);
  51.             //---------------------------passport注册或登陆整合结束-----------------------------
  52.         }else Response.Write("登陆失败<br>");
  53.     }


  54.     //------------------------------------以下为一些关键函数------------------------------
  55.     // 将字符串转换为byte数组     
  56.     public byte[] strToByteAry(string str){
  57.         return Encoding.Default.GetBytes(str);
  58.     }
  59.    
  60.    // c# dz通信证编码函数
  61.    public string passport_encrypt(string txt, string key){
  62.         byte[] randomNumber = new byte[1];
  63.         RNGCryptoServiceProvider Gen = new RNGCryptoServiceProvider();
  64.         Gen.GetBytes(randomNumber);
  65.         int rand = Convert.ToInt32(randomNumber[0]);
  66.         string encrypt_key = md5(rand.ToString());

  67.         byte[] txtAry = strToByteAry(txt);
  68.         byte[] encryAry = strToByteAry(encrypt_key);
  69.         int j = 0;
  70.         int ctr = 0;
  71.         byte[] tmp = new byte[2 * txtAry.Length];
  72.         for (int i = 0; i < txtAry.Length; i++)
  73.         {
  74.             ctr = ctr == encryAry.Length ? 0 : ctr;
  75.             tmp[j++] = encryAry[ctr];
  76.             tmp[j++] = xor(txtAry[i], encryAry[ctr++]);
  77.         }
  78.         return Convert.ToBase64String(passport_key(tmp, key));
  79.     }

  80.    
  81.     // c# dz通行证解码函数
  82.     public string passport_decrypt(string txt, string key){
  83.         byte[] t = Convert.FromBase64String(txt);
  84.         byte[] btxt = passport_key(t, key);
  85.         byte[] btmp = new byte[btxt.Length];
  86.         int j = 0;
  87.         for (int i = 0; i < btxt.Length; i++, j++)
  88.             btmp[j] = xor(btxt[i], btxt[++i]);
  89.         return Encoding.Default.GetString(btmp);
  90.     }


  91.    
  92.     // c# dz通行证密匙处理函数   
  93.     public byte[] passport_key(byte[] btxt, string key){
  94.         key = md5(key);
  95.         byte[] keyAry = strToByteAry(key);
  96.         int ctr = 0;
  97.         byte[] tmp = new byte[btxt.Length];
  98.         for (int i = 0; i < btxt.Length; i++){
  99.             ctr = (ctr == keyAry.Length) ? 0 : ctr;
  100.             tmp[i] = xor(btxt[i], keyAry[ctr++]);
  101.         }
  102.         return tmp;
  103.     }

  104.    
  105.     // 针对byte的异或     
  106.     public byte xor(byte a, byte b){
  107.         return Convert.ToByte(a ^ b);
  108.     }
  109.    
  110.     // 获取UNIX时间戳   
  111.     public string time(){
  112.         DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
  113.         DateTime dtNow = DateTime.Parse(DateTime.Now.ToString());
  114.         TimeSpan toNow = dtNow.Subtract(dtStart);
  115.         string timeStamp = toNow.Ticks.ToString();
  116.         timeStamp = timeStamp.Substring(0, timeStamp.Length - 7);
  117.         return timeStamp;
  118.     }

  119.    
  120.     // md5加密
  121.     public string md5(string str){
  122.         MD5 md5Hasher = MD5.Create();
  123.         string re="";
  124.         byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(str));
  125.         for (int i = 0; i < data.Length; i++)
  126.             re += data[i].ToString("x2");        
  127.         return re;
  128.     }
  129. }

复制代码

[ 本帖最后由 huozhe3136 于 2006-10-8 11:48 编辑 ]

本帖子中包含更多资源

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

x

评分

2

查看全部评分

phpspy 发表于 2006-5-29 16:40:46 | 显示全部楼层
好文章学习中
回复

使用道具 举报

jzhcctv 发表于 2006-5-29 16:41:43 | 显示全部楼层
感谢
回复

使用道具 举报

ㄨЬái鷺♂ 发表于 2006-5-29 16:47:25 | 显示全部楼层
昏。早见过了。
回复

使用道具 举报

phpspy 发表于 2006-5-29 17:09:40 | 显示全部楼层
?>
<form action=login.php?act=login method=post>
用户名:<input name=username>
密码:<input name=password>
<input name=submit type=submit value=登陆></form>
<?php
这段代码应该怎么理解!菜问题!
回复

使用道具 举报

 楼主| huozhe3136 发表于 2006-5-30 08:42:02 | 显示全部楼层
第七篇:jsp与discuz的整合方法
一直有人问我jsp与dz的整合方法,不过我对jsp一点都不熟,基本上就是不会。
后网上搜了一篇文章,也没注明是哪位仁兄所写的,我没有验证过,现贴出供大家参考。
jsp 应用系统整合discuz论坛用户系统
关键代码
  1. /**
  2. * MD5算法
  3. * @param strToEncrypt
  4. * @return
  5. */
  6. public static String  Md5(String strToEncrypt)
  7. {
  8. char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  9.    'a', 'b', 'c', 'd', 'e', 'f' };
  10.   try
  11.   {
  12.    byte[] strTemp = strToEncrypt.getBytes();
  13.    MessageDigest mdTemp = MessageDigest.getInstance("MD5");
  14.    mdTemp.update(strTemp);
  15.    byte[] md = mdTemp.digest();
  16.    int j = md.length;
  17.    char str[] = new char[j * 2];
  18.    int k = 0;
  19.    for (int i = 0; i < j; i++)
  20.    {
  21.     byte byte0 = md[i];
  22.     str[k++] = hexDigits[byte0 >>> 4 & 0xf];
  23.     str[k++] = hexDigits[byte0 & 0xf];
  24.    }
  25.    return new String(str);
  26.   }
  27.   catch (Exception e)
  28.   {
  29.    return "";
  30.   }

  31. }
复制代码
整合函数
  1. package com.tecamo.cms.util;

  2. import java.io.UnsupportedEncodingException;
  3. import java.util.Map;
  4. import java.util.Random;
  5. import java.util.Set;

  6. import com.tecamo.util.encrypt.EncryptString;

  7. import sun.misc.BASE64Decoder;


  8. public class DiscuzPassportUtils
  9. {

  10. public static String passportEncrypt(String src, String key) {
  11.    Random random = new Random();
  12.    random.setSeed(System.currentTimeMillis());
  13.    String rand = "" + random.nextInt() % 32000;
  14.    String encryptKey = EncryptString.encryptMD5(rand);

  15.    int ctr = 0;
  16.    String tmp = "";

  17.    for (int i = 0; i < src.length(); ++i) {
  18.      ctr = (ctr == encryptKey.length() ? 0 : ctr);
  19.      tmp += encryptKey.charAt(ctr);
  20.      char c = (char) (src.charAt(i) ^ encryptKey.charAt(ctr));
  21.      tmp += c;
  22.      ctr++;
  23.    }
  24.    String passportKey = passportKey(tmp, key);
  25.    return new sun.misc.BASE64Encoder().encode(passportKey.getBytes());
  26. }

  27. public static String passortDecrypt(String src, String key) {
  28.    byte[] bytes = null;
  29.    try {
  30.      bytes = new BASE64Decoder().decodeBuffer(src);
  31.      src = new String(bytes);
  32.    } catch (Exception e) {
  33.      return null;
  34.    }
  35.    src = passportKey(src, key);

  36.    String tmp = "";
  37.    for (int i = 0; i < src.length(); ++i) {
  38.      char c = (char)(src.charAt(i) ^ src.charAt(++i));
  39.      tmp += c;
  40.    }
  41.    return tmp;
  42. }

  43. public static String passportKey(String src, String key) {
  44.    String encryptKey = EncryptString.encryptMD5(key);
  45.    int ctr = 0;
  46.    String tmp = "";
  47.    for (int i = 0; i < src.length(); ++i) {
  48.      ctr = (ctr == encryptKey.length() ? 0 : ctr);
  49.      char c = (char) (src.charAt(i) ^ encryptKey.charAt(ctr));
  50.      tmp += c;
  51.      ctr++;
  52.    }
  53.    return tmp;
  54. }


  55. public static String passportEncode(Map<String, String> data) {
  56.    Set<String> keys = data.keySet();
  57.    String ret = "";
  58.    for (String key : keys) {
  59.      try {
  60.        ret += java.net.URLEncoder.encode(key, "UTF-8") + "=" + java.net.URLEncoder.encode(data.get(key), "UTF-8") + "&";
  61.      } catch (UnsupportedEncodingException e) {
  62.        return "";
  63.      }
  64.    }
  65.    if (ret.length() > 0)
  66.      return ret.substring(0, ret.length() - 1);
  67.    return "";
  68. }
  69. }
复制代码
调用方法:
login.jsp
  1. <%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
  2. <%@page import="com.tecamo.util.web.MyRequest"%>
  3. <%@page import="com.tecamo.cms.util.DiscuzPassportUtils"%>
  4. <%@page import="com.tecamo.cms.util.ShareFunction"%>
  5. <%@page import="com.tecamo.util.encrypt.EncryptString"%>
  6. <%@page import="java.net.URLEncoder"%>
  7. <%

  8. String strUser=(String) session.getAttribute("username");
  9. if(strUser!=null && !strUser.equals(""))
  10. {
  11.     out.println("当前用户:" + strUser);
  12. }

  13. String forward=MyRequest.getString(request,"forward","");
  14. String action=MyRequest.getString(request,"action","");
  15. if(action.equals("login"))
  16. {
  17.     String forumURL="http://devserver:8066";
  18.     String userName=MyRequest.getString(request,"account","");
  19.     String email=userName;
  20.     String pwd=MyRequest.getString(request,"pwd","");
  21.     Map<String, String> mb = new LinkedHashMap<String, String>();

  22.     mb.put("time", ""+System.currentTimeMillis());
  23.     mb.put("username", userName);
  24.     mb.put("email", email);
  25.     mb.put("password", pwd);
  26.     String key = "12345678901";
  27.     String enc=DiscuzPassportUtils.passportEncode(mb);
  28.     String auth = DiscuzPassportUtils.passportEncrypt(enc, key);
  29.     String verify = "login" + auth + forward + key;
  30.     verify = EncryptString.encryptMD5(verify);                                       
  31.     String location = forumURL+"/api/passport.php?action=login&auth="+URLEncoder.encode(auth, "UTF-8")+"&forward="+URLEncoder.encode(forward, "UTF-8")+"&verify="+URLEncoder.encode(verify, "UTF-8");

  32.     response.sendRedirect(location);
  33.    
  34.     session.setAttribute("username",userName);
  35. }

  36. %>
  37. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  38. <html>
  39.   <head>
  40.   
  41.   </head>
  42.   
  43.   <body>
  44.       <form>
  45.           <table>
  46.               <tr>
  47.                   <td>帐号</td><td><input type="text" name="account"></td>
  48.               </tr>
  49.               <tr><td>密码</td><td><input type="password" name="pwd"></td></tr>
  50.               <tr><td colspan="2">
  51.               <input type="hidden" value="<%=forward%>">
  52.               <input type="hidden" name="action" value="login">
  53.               <input type="submit" value="登录"> </td></tr>
  54.           </table>
  55.       </form>
  56.   </body>
  57. </html>
复制代码
logout.jsp
  1. <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
  2. <%@page import="com.tecamo.util.encrypt.EncryptString"%>
  3. <%@page import="java.net.URLEncoder"%>
  4. <%@page import="com.tecamo.util.web.MyRequest"%>
  5. <%
  6. //discuz 地址
  7. String forumURL=http://dddd:8066;
  8. String forward=MyRequest.getString(request,"forward","");
  9. //discuz 配置的私钥
  10. String key = "12345678901";                                       
  11. String verify = "logout" + forward + key;
  12. verify = EncryptString.encryptMD5(verify);        
  13. String location = forumURL+"/api/passport.php?action=logout&forward="+URLEncoder.encode(forward, "UTF-8")+"&verify="+URLEncoder.encode(verify, "UTF-8");
  14. response.sendRedirect(location);
  15. session.invalidate();
  16. %>
复制代码

[ 本帖最后由 huozhe3136 于 2008-4-7 11:50 编辑 ]
回复

使用道具 举报

cjpsn 发表于 2006-5-30 09:10:09 | 显示全部楼层
首先说,你是尽心的为大家服务的!你的代码是一个非常好的一个实例!但好像实用性方面有点欠缺!笔者建议能把上述代码用一个真正的网站实例来演示的更好!非常欣赏你代码运用之精妙,现以dz整合168整站为例,加以讲解说明!

1.dz整合168整站(或者说dz与168整站实现数据共享,共用一个通行证,实现同步登录的功能!)
2.你不必担心技术难度,因为单从整合数据一方来说,目前已经解决!只是不能同步登录!如果你很想帮助我们解决问题,请用dz passport的应用角度给个解决办法!
3.168整站相关文件代码:
login.php代码,重点修改部分


<?php
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,'/');
        //}
        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]];
        }
        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;
                }
               
                //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);
                refreshto($jumpurl,'login_succeed');
        }

}else{

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

}
?>

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

使用道具 举报

phpspy 发表于 2006-5-30 09:58:56 | 显示全部楼层
提个比较菜的问题!上面大家写的好象都是DZ与CMS连接的部分!但是CMS与DZ连接的部分应该怎么写!特别是数据部分!这个LOGIN.PHP是放到DZ里的吧!?谢谢了!
回复

使用道具 举报

phpspy 发表于 2006-5-30 11:11:30 | 显示全部楼层
header('Location: http://www.myforums.com/api/pass ... /yyy&verify=zzz')
和 header('Location: http://www.myforums.com/api/pass ... /yyy&verify=zzz')
这个变量要分别加到CMS的登陆和登出代码里么?
回复

使用道具 举报

 楼主| huozhe3136 发表于 2006-5-30 12:09:16 | 显示全部楼层
原帖由 phpspy 于 2006-5-30 09:58 发表
提个比较菜的问题!上面大家写的好象都是DZ与CMS连接的部分!但是CMS与DZ连接的部分应该怎么写!特别是数据部分!这个LOGIN.PHP是放到DZ里的吧!?谢谢了!




这个login.php是放到 cms里的
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-26 11:50 , Processed in 0.120224 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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