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中拷贝构造函数、赋值运算符重载
Jul 25 PHP
淘宝ip地址查询类分享(利用淘宝ip库)
Jan 07 PHP
php的array数组和使用实例简明教程(容易理解)
Mar 20 PHP
VB中的RasEnumConnections函数返回632错误解决方法
Jul 29 PHP
PHP 绘制网站登录首页图片验证码
Apr 12 PHP
PHP获取用户访问IP地址的5种方法
May 16 PHP
PHP实现JS中escape与unescape的方法
Jul 11 PHP
php实现在新浪云中使用imagick生成缩略图并上传的方法
Sep 26 PHP
PHP连接MySQL进行增、删、改、查操作
Feb 19 PHP
php实现自定义中奖项数和概率的抽奖函数示例
May 26 PHP
Yii2语言国际化自动配置详解
Aug 22 PHP
PHP设计模式之策略模式原理与用法实例分析
Apr 04 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
一个简单的自动发送邮件系统(三)
2006/10/09 PHP
php导入csv文件碰到乱码问题的解决方法
2014/02/10 PHP
PHP指定截取字符串中的中英文或数字字符的实例分享
2016/03/18 PHP
基于ThinkPHP实现的日历功能实例详解
2017/04/15 PHP
[原创]PHP实现生成vcf vcard文件功能类定义与使用方法详解【附demo源码下载】
2017/09/02 PHP
一个JQuery写的点击上下滚动的小例子
2011/08/27 Javascript
SOSO地图API使用(一)在地图上画圆实现思路与代码
2013/01/15 Javascript
JS事件在IE与FF中的区别详细解析
2013/11/20 Javascript
javascript确认框的三种使用方法
2013/12/17 Javascript
JavaScript中定义类的方式详解
2016/01/07 Javascript
基于Vuejs和Element的注册插件的编写方法
2017/07/03 Javascript
JS路由跳转的简单实现代码
2017/09/21 Javascript
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
2018/01/11 Javascript
JavaScript实现写入文件到本地的方法【基于FileSaver.js插件】
2018/03/15 Javascript
讲解vue-router之什么是动态路由
2018/05/28 Javascript
DatePickerDialog 自定义样式及使用全解
2019/07/09 Javascript
原生JavaScript实现拖动校验功能
2020/09/29 Javascript
vue用ant design中table表格,点击某行时触发的事件操作
2020/10/28 Javascript
[36:05]DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs Optic
2018/04/01 DOTA
[43:43]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第三场 11.29
2020/12/02 DOTA
win7安装python生成随机数代码分享
2013/12/27 Python
python 创建弹出式菜单的实现代码
2017/07/11 Python
python机器学习之神经网络(二)
2017/12/20 Python
Python 数据处理库 pandas进阶教程
2018/04/21 Python
python实现超简单的视频对象提取功能
2018/06/04 Python
python接口自动化之ConfigParser配置文件的使用详解
2020/08/03 Python
Anaconda详细安装步骤图文教程
2020/11/12 Python
利用CSS3制作简单的3d半透明立方体图片展示
2017/03/25 HTML / CSS
世界上最大的曲棍球商店:Pro Hockey Life
2017/10/30 全球购物
长青弘远的面试题
2012/06/09 面试题
大专毕业生自我鉴定范文(2篇)
2014/09/27 职场文书
导游词之崇武古城
2019/10/07 职场文书
vue+elementui 实现新增和修改共用一个弹框的完整代码
2021/06/08 Vue.js
python识别围棋定位棋盘位置
2021/07/26 Python
redis 存储对象的方法对比分析
2021/08/02 Redis
速龙x4-860k处理器相当于i几
2022/04/20 数码科技