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.MVC的模板标签系统(二)
Sep 05 PHP
提示Trying to clone an uncloneable object of class Imagic的解决
Oct 27 PHP
PHP查询数据库中满足条件的记录条数(两种实现方法)
Jan 29 PHP
基于php iconv函数的使用详解
Jun 09 PHP
PHP系统命令函数使用分析
Jul 05 PHP
PHP通过内置函数memory_get_usage()获取内存使用情况
Nov 20 PHP
php+mysqli事务控制实现银行转账实例
Jan 29 PHP
PHP中4种常用的抓取网络数据方法
Jun 04 PHP
phpcms中的评论样式修改方法
Oct 21 PHP
php中分页及SqlHelper类用法实例
Jan 12 PHP
yii2局部关闭(开启)csrf的验证的实例代码
Jul 10 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
Jun 25 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常用Output和ptions/Info函数集介绍
2013/06/19 PHP
PHPUnit安装及使用示例
2014/10/29 PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
2015/08/08 PHP
基于ThinkPHP实现批量删除
2015/12/18 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
2015/12/19 PHP
php的闭包(Closure)匿名函数初探
2016/02/14 PHP
php 使用mpdf实现指定字段配置字体样式的方法
2019/07/29 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
基于JQuery 滑动与动画的说明介绍
2013/04/18 Javascript
js 获取、清空input type=&quot;file&quot;的值示例代码
2014/02/19 Javascript
浅谈JavaScript 框架分类
2014/11/10 Javascript
JavaScript模拟可展开、拖动与关闭的聊天窗口实例
2015/05/12 Javascript
《JavaScript高级编程》学习笔记之object和array引用类型
2015/11/01 Javascript
跟我学习javascript的prototype使用注意事项
2015/11/17 Javascript
Javascript 实现微信分享(QQ、朋友圈、分享给朋友)
2016/10/21 Javascript
AngularJS使用拦截器实现的loading功能完整实例
2017/05/17 Javascript
Vue计算属性的使用
2017/08/04 Javascript
vue 页面加载进度条组件实例
2018/02/05 Javascript
node.js express捕获全局异常的三种方法实例分析
2019/12/27 Javascript
详解vue 组件
2020/06/11 Javascript
深入理解Python中的 __new__ 和 __init__及区别介绍
2018/09/17 Python
python如何读取bin文件并下发串口
2019/07/05 Python
浅谈Python中文件夹和python package包的区别
2020/06/01 Python
Python如何避免文件同名产生覆盖
2020/06/09 Python
CSS中几个与换行有关的属性简明总结
2014/04/15 HTML / CSS
英国电视和家用电器购物网站:rlrdistribution.co.uk
2018/11/20 全球购物
加拿大户外探险购物网站:SAIL
2020/06/27 全球购物
幼儿教师师德承诺书
2014/05/23 职场文书
个人求职自荐信范文
2014/06/20 职场文书
党在我心中的演讲稿
2014/09/13 职场文书
护士医德医风自我评价
2014/09/15 职场文书
个人遵守党的政治纪律情况对照检查材料思想汇报
2014/09/25 职场文书
2015年乡镇发展党员工作总结
2015/03/31 职场文书
HTML中table表格拆分合并(colspan、rowspan)
2021/04/07 HTML / CSS
教你部署vue项目到docker
2022/04/05 Vue.js
python pygame 开发五子棋双人对弈
2022/05/02 Python