discuz Passport 通行证 整合笔记


Posted in PHP onJune 30, 2008

太简单了,但时间长了,记不得,浪费我半小时找资料,深刻体会好记性不如烂笔头!!今天把passport文挡贴上,防止以后忘记!!记住,网上找到自己需要的资料也要耗时间的!!!!!!

Passport 通行证 整合

第一篇:整合原理

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

discuz Passport 通行证 整合笔记setting.gif (4.3 KB)
2006-9-30 13:59

第二步: 删除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);

}
//=========================================================================
//===========================拷贝结束======================================
?>

PHP 相关文章推荐
php你的验证码安全码?
Jan 02 PHP
PHP详细彻底学习Smarty
Mar 27 PHP
PHP strtotime函数详解
Dec 18 PHP
php模块memcache和memcached区别分析
Jun 14 PHP
PHP flock 文件锁详细介绍
Dec 29 PHP
php 常用算法和时间复杂度
Jul 01 PHP
限制ckeditor上传图片文件大小的方法
Nov 15 PHP
Php无限级栏目分类读取的实现代码
Feb 19 PHP
PHP中file_exists使用中遇到的问题小结
Apr 05 PHP
示例详解Laravel的注册重构
Aug 14 PHP
php自定义函数转换html标签示例
Sep 29 PHP
Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法
Sep 30 PHP
php下检测字符串是否是utf8编码的代码
Jun 28 #PHP
php GD绘制24小时柱状图
Jun 28 #PHP
php 在线打包_支持子目录
Jun 28 #PHP
php 前一天或后一天的日期
Jun 28 #PHP
js下函数般调用正则的方法附代码
Jun 22 #PHP
php的正则处理函数总结分析
Jun 20 #PHP
PHP伪静态页面函数附使用方法
Jun 20 #PHP
You might like
一个php作的文本留言本的例子(四)
2006/10/09 PHP
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
2012/10/31 PHP
php使用GeoIP库实例
2014/06/27 PHP
PHP开发框架kohana3 自定义路由设置示例
2014/07/14 PHP
php字符串比较函数用法小结(strcmp,strcasecmp,strnatcmp及strnatcasecmp)
2016/07/18 PHP
php模拟实现斗地主发牌
2020/04/22 PHP
PHP 实现缩略图
2021/03/09 PHP
JS代码放在head和body中的区别分析
2011/12/01 Javascript
javascript格式化指定日期对象的方法
2015/04/21 Javascript
jquery.map()方法的使用详解
2015/07/09 Javascript
Centos7 中安装 Node.js v4.4.4
2016/11/03 Javascript
使用JavaScript触发过渡效果的方法
2017/01/19 Javascript
JS表单提交验证、input(type=number) 去三角 刷新验证码
2017/06/21 Javascript
vue项目中使用axios上传图片等文件操作
2017/11/02 Javascript
10个经典的网页鼠标特效代码
2018/01/09 Javascript
javascript中关于类型判断的一些疑惑小结
2018/10/14 Javascript
vue cli4下环境变量和模式示例详解
2020/04/09 Javascript
Vue如何实现变量表达式选择器
2021/02/18 Vue.js
使用python调用浏览器并打开一个网址的例子
2014/06/05 Python
Python虚拟环境项目实例
2017/11/20 Python
python 反向输出字符串的方法
2018/07/16 Python
python实现控制电脑鼠标和键盘,登录QQ的方法示例
2019/07/06 Python
Python交互环境下打印和输入函数的实例内容
2020/02/16 Python
HTML5 本地存储之如果没有数据库究竟会怎样
2013/04/25 HTML / CSS
Html5导航栏吸顶方案原理与对比实现
2020/06/10 HTML / CSS
JDK安装目录下有哪些内容
2014/08/25 面试题
值传递还是引用传递
2015/02/08 面试题
运动会方阵解说词
2014/02/12 职场文书
小学毕业感言50字
2014/02/16 职场文书
5s推行计划书
2014/05/06 职场文书
党支部三会一课计划
2014/09/24 职场文书
群众路线个人整改方案
2014/10/25 职场文书
学生考试舞弊检讨书
2015/01/01 职场文书
机器人总动员观后感
2015/06/09 职场文书
2016年社区“6.26”禁毒日宣传活动总结
2016/04/05 职场文书
win10双系统怎么删除一个系统?win10电脑有两个系统删除一个的操作方法
2022/07/15 数码科技