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 Memcached应用实现代码
Feb 08 PHP
PHP中=赋值操作符对不同数据类型的不同行为
Jan 02 PHP
PHP发明人谈MVC和网站设计架构 貌似他不支持php用mvc
Jun 04 PHP
PHP生成唯一的促销/优惠/折扣码(附源码)
Dec 28 PHP
php日历制作代码分享
Jan 20 PHP
php调用C代码的实现方法
Mar 11 PHP
ThinkPHP实现将本地文件打包成zip下载
Jun 26 PHP
php实现zip文件解压操作
Nov 03 PHP
php支持断点续传、分块下载的类
May 02 PHP
PHP Oauth授权和本地加密实现方法
Aug 12 PHP
laravel dingo API返回自定义错误信息的实例
Sep 29 PHP
PHP全局使用Laravel辅助函数dd
Dec 26 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
漫威DC御用漫画家去世 他的表情包曾走红网络
2020/04/09 欧美动漫
php 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
解析如何屏蔽php中的phpinfo()函数
2013/06/06 PHP
PHP分页效率终结版(推荐)
2013/07/01 PHP
PHP实现批量清空删除指定文件夹所有内容的方法
2017/05/30 PHP
PhpStorm本地断点调试的方法步骤
2018/05/21 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
2019/04/15 PHP
js如何获取兄弟、父类等节点
2014/01/06 Javascript
jquery实现的点击翻书效果代码
2015/11/04 Javascript
前端学习笔记style,currentStyle,getComputedStyle的用法与区别
2016/05/28 Javascript
jQuery实现限制文本框的输入长度
2017/01/11 Javascript
纯jQuery实现前端分页功能
2017/03/23 jQuery
Angular.JS中的this指向详解
2017/05/17 Javascript
vue.js 获取select中的value实例
2018/03/01 Javascript
nuxt框架中路由鉴权之Koa和Session的用法
2018/05/09 Javascript
Vue使用Ref跨层级获取组件的步骤
2021/01/25 Vue.js
常用python数据类型转换函数总结
2014/03/11 Python
python实现二维数组的对角线遍历
2019/03/02 Python
python-docx文件定位读取过程(尝试替换)
2020/02/13 Python
jupyter notebook 重装教程
2020/04/16 Python
使用keras实现BiLSTM+CNN+CRF文字标记NER
2020/06/29 Python
5款实用的python 工具推荐
2020/10/13 Python
PyQT5速成教程之Qt Designer介绍与入门
2020/11/02 Python
Python中全局变量和局部变量的理解与区别
2021/02/07 Python
CSS3 :not()选择器实现最后一行li去除某种css样式
2016/10/19 HTML / CSS
HTML5 新标签全部总汇(推荐)
2016/06/13 HTML / CSS
Dune London官网:英国著名奢华鞋履品牌
2017/11/30 全球购物
英国现代家具和照明购物网站:Heal’s
2019/10/30 全球购物
俄罗斯领先的移动和数字设备在线商店:Svyaznoy.ru
2020/12/21 全球购物
体育教师自我鉴定
2014/02/12 职场文书
2014年公司庆元旦活动方案
2014/03/05 职场文书
公司委托书格式
2014/08/01 职场文书
邹越感恩父母演讲稿
2014/08/28 职场文书
政府班子四风问题整改措施
2014/10/04 职场文书
2015年财务部年度工作总结
2015/05/19 职场文书
2015年小学教导处工作总结
2015/05/26 职场文书