Discuz的passport与其他登录系统的整合

Discuz的passport与其他登录系统的整合

源贴地址:http://www.zjnch.cn/blog/?action=show&id=24

PHP代码
 
  1. <?php       
  2. $path_bbs="upload/";                //bbs的相对路径地址   
  3. $check_username="admin";            //测试用的用户名和密码,简单测试用,可以从数据库中读取,这里只是简单的测试   
  4. $check_password="admin";       
  5.       
  6. if(@$_GET['action']=="logout")      //用户退出,清楚cookie   
  7. {       
  8.     setcookie('username','',time() - 3600);       
  9.     $username = "admin";       
  10.     $pwd = "admin";       
  11.     $member = array                 //menber数组,传递给dz论坛,必填的为time、username、password、email,没填则会报错,同时假如论坛数据   
  12.         (                           //库中没有该记录,直接插入论坛用户表中,如果有则更新表中该用户信息   
  13.         'cookietime'    => time(),       
  14.         'time'      => time(),       
  15.         'username'  => $username,       
  16.         'password'  => md5($pwd),       
  17.         'email'     => 'abcd@efgh.com',       
  18.         );       
  19.     $passport_key = "ffffffffffff";    //dz后台系统设置中的密钥   
  20.     $action     = 'logout';       
  21.     $forward = "http://localhost/www/discuz/upload/";    //重定向地址,告诉dz登录以后重定向到该地址   
  22.     $auth = passport_encrypt(passport_encode($member), $passport_key);    //利用dz函数passport_encrypt对信息进行加密再传递给passport.php   
  23.       
  24.     $verify = md5($action.$auth.$forward.$passport_key);       
  25.       
  26.     header("Location: http://localhost/www/discuz/upload/api/passport.php"."?action=$action"."&auth=".rawurlencode($auth)."&forward=".rawurlencode($forward)."&verify=$verify");        //将参数传递给passport.php,必须以这种格式.   
  27. }       
  28. if(isset($_POST["submit"]))     //登录判断,原理跟用户推出差不多   
  29. {       
  30.     $username=trim($_POST['username']);       
  31.     $pwd=trim($_POST['password']);       
  32.     setcookie('username',$username);       
  33.     $member = array      
  34.         (       
  35.         'cookietime'    => time(),       
  36.         'time'      => time(),       
  37.         'username'  => $username,       
  38.         'password'  => md5($pwd),       
  39.         'email'     => 'abcd@efgh.com',       
  40.         );       
  41.     $passport_key = "ffffffffffff";       
  42.     $action     = 'login';       
  43.     $forward = "http://localhost/www/discuz/login.php";       
  44.     $auth = passport_encrypt(passport_encode($member), $passport_key);       
  45.       
  46.     $verify = md5($action.$auth.$forward.$passport_key);       
  47.     if($username==$check_username && $pwd==$check_password)       
  48.     {       
  49.       
  50.         header("Location: http://localhost/www/discuz/upload/api/passport.php"."?action=$action"."&auth=".rawurlencode($auth)."&forward=".rawurlencode($forward)."&verify=$verify");           
  51.     }       
  52. }       
  53. ?>       
  54. <?php       
  55. if(@$_COOKIE['username']==''){       
  56. ?>       
  57. <form action="" method="POST">       
  58. 用户名:<input name="username">测试用户名为admin<br>       
  59. 密码:<input type="password" name="password">测试密码为admin<br>       
  60. <input type="submit" name="submit" value="测试">       
  61. </form>       
  62. <?php       
  63. }       
  64. else echo("登陆成功,<a href='{$path_bbs}index.php' target=_blank>请到论坛检查登陆</a><br><a href='?act=logout'>退出登陆</a> ");       
  65. ?>       
  66. <?php       
  67. /**     
  68.     * Passport 加密函数     
  69.     *     
  70.     * @param        string      等待加密的原字串     
  71.     * @param        string      私有密匙(用于解密和加密)     
  72.     *     
  73.     * @return   string      原字串经过私有密匙加密后的结果     
  74.     */      
  75.     function passport_encrypt($txt$key) {       
  76.       
  77.         // 使用随机数发生器产生 0~32000 的值并 MD5()       
  78.         srand((double)microtime() * 1000000);       
  79.         $encrypt_key = md5(rand(0, 32000));       
  80.       
  81.         // 变量初始化       
  82.         $ctr = 0;       
  83.         $tmp = '';       
  84.       
  85.         // for 循环,$i 为从 0 开始,到小于 $txt 字串长度的整数       
  86.         for($i = 0; $i < strlen($txt); $i++) {       
  87.             // 如果 $ctr = $encrypt_key 的长度,则 $ctr 清零       
  88.             $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;       
  89.             // $tmp 字串在末尾增加两位,其第一位内容为 $encrypt_key 的第 $ctr 位,       
  90.             // 第二位内容为 $txt 的第 $i 位与 $encrypt_key 的 $ctr 位取异或。然后 $ctr = $ctr + 1       
  91.             $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);       
  92.         }       
  93.       
  94.         // 返回结果,结果为 passport_key() 函数返回值的 base64 编码结果       
  95.         return base64_encode(passport_key($tmp$key));       
  96.       
  97.     }       
  98.       
  99.     /**     
  100.     * Passport 解密函数     
  101.     *     
  102.     * @param        string      加密后的字串     
  103.     * @param        string      私有密匙(用于解密和加密)     
  104.     *     
  105.     * @return   string      字串经过私有密匙解密后的结果     
  106.     */      
  107.     function passport_decrypt($txt$key) {       
  108.       
  109.         // $txt 的结果为加密后的字串经过 base64 解码,然后与私有密匙一起,       
  110.         // 经过 passport_key() 函数处理后的返回值       
  111.         $txt = passport_key(base64_decode($txt), $key);       
  112.       
  113.         // 变量初始化       
  114.         $tmp = '';       
  115.       
  116.         // for 循环,$i 为从 0 开始,到小于 $txt 字串长度的整数       
  117.         for ($i = 0; $i < strlen($txt); $i++) {       
  118.             // $tmp 字串在末尾增加一位,其内容为 $txt 的第 $i 位,       
  119.             // 与 $txt 的第 $i + 1 位取异或。然后 $i = $i + 1       
  120.             $tmp .= $txt[$i] ^ $txt[++$i];       
  121.         }       
  122.       
  123.         // 返回 $tmp 的值作为结果       
  124.         return $tmp;       
  125.       
  126.     }       
  127.       
  128.     /**     
  129.     * Passport 密匙处理函数     
  130.     *     
  131.     * @param        string      待加密或待解密的字串     
  132.     * @param        string      私有密匙(用于解密和加密)     
  133.     *     
  134.     * @return   string      处理后的密匙     
  135.     */      
  136.     function passport_key($txt$encrypt_key) {       
  137.       
  138.         // 将 $encrypt_key 赋为 $encrypt_key 经 md5() 后的值       
  139.         $encrypt_key = md5($encrypt_key);       
  140.       
  141.         // 变量初始化       
  142.         $ctr = 0;       
  143.         $tmp = '';       
  144.       
  145.         // for 循环,$i 为从 0 开始,到小于 $txt 字串长度的整数       
  146.         for($i = 0; $i < strlen($txt); $i++) {       
  147.             // 如果 $ctr = $encrypt_key 的长度,则 $ctr 清零       
  148.             $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;       
  149.             // $tmp 字串在末尾增加一位,其内容为 $txt 的第 $i 位,       
  150.             // 与 $encrypt_key 的第 $ctr + 1 位取异或。然后 $ctr = $ctr + 1       
  151.             $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];       
  152.         }       
  153.       
  154.         // 返回 $tmp 的值作为结果       
  155.         return $tmp;       
  156.       
  157.     }       
  158.       
  159.     /**     
  160.     * Passport 信息(数组)编码函数     
  161.     *     
  162.     * @param        array       待编码的数组     
  163.     *     
  164.     * @return   string      数组经编码后的字串     
  165.     */      
  166.     function passport_encode($array) {       
  167.       
  168.         // 数组变量初始化       
  169.         $arrayenc = array();       
  170.       
  171.         // 遍历数组 $array,其中 $key 为当前元素的下标,$val 为其对应的值       
  172.         foreach($array as $key => $val) {       
  173.             // $arrayenc 数组增加一个元素,其内容为 "$key=经过 urlencode() 后的 $val 值"       
  174.             $arrayenc[] = $key.'='.urlencode($val);       
  175.         }       
  176.       
  177.         // 返回以 "&" 连接的 $arrayenc 的值(implode),例如 $arrayenc = array('aa', 'bb', 'cc', 'dd'),       
  178.         // 则 implode('&', $arrayenc) 后的结果为 ”aa&bb&cc&dd"       
  179.         return implode('&'$arrayenc);       
  180.       

    }       

?>     

注释都在里面的,可以稍微修改下变成自己需要的

dz后台通行证的设置是这样的:

应用程序 URL 地址:http://localhost/www/discuz/
通行证私有密匙:ffffffffffff
验证字串有效期(秒):3600
应用程序注册地址:register.php  //注册模块未写,原理差不多
应用程序登录地址:login.php?action=login
应用程序退出地址:login.php?action=logout

login.php是放在discuz下面的,dz的程序是放在discuz下面的upload目录,基本结构就是这样

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值