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 相关文章推荐
PHPWind 发帖回帖Api PHP版打包下载
Feb 08 PHP
ThinkPHP利用PHPMailer实现邮件发送实现代码
Sep 26 PHP
php操作csv文件代码实例汇总
Sep 22 PHP
Codeigniter框架实现获取分页数据和总条数的方法
Dec 05 PHP
PHP处理数组和XML之间的互相转换
Jun 02 PHP
PHP图片添加水印功能示例小结
Oct 03 PHP
老生常谈php中传统验证与thinkphp框架(必看篇)
Jun 10 PHP
微信开发之获取JSAPI TICKET
Jul 07 PHP
PHP验证码无法显示的原因及解决办法
Aug 11 PHP
PHP实现生成模糊图片的方法示例
Dec 21 PHP
PHP获取ttf格式文件字体名的方法示例
Mar 06 PHP
php伪静态验证码不显示的解决方案
Sep 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
使用PHP计算两个路径的相对路径
2013/06/14 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
2016/01/11 PHP
DOM Scripting中的图片切换[兼容Firefox]
2010/06/12 Javascript
javascript中callee与caller的用法和应用场景
2010/12/08 Javascript
javascript分页代码(当前页码居中)
2012/09/20 Javascript
文字不间断滚动(上下左右)实例代码
2013/04/21 Javascript
使用jquery实现鼠标滑过弹出更多相关信息层附源码下载
2015/11/23 Javascript
超实用的JavaScript代码段 附使用方法
2016/05/22 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
2017/03/06 Javascript
vue+node+webpack环境搭建教程
2017/11/05 Javascript
vue如何截取字符串
2019/05/06 Javascript
js 将线性数据转为树形的示例代码
2019/05/28 Javascript
vue2.x 通过后端接口代理,获取qq音乐api的数据示例
2019/10/30 Javascript
解决vue一个页面中复用同一个echarts组件的问题
2020/07/19 Javascript
Python 字符串定义
2009/09/25 Python
python k-近邻算法实例分享
2014/06/11 Python
通过Python来使用七牛云存储的方法详解
2015/08/07 Python
Python实现矩阵加法和乘法的方法分析
2017/12/19 Python
Python中max函数用于二维列表的实例
2018/04/03 Python
Python闭包函数定义与用法分析
2018/07/20 Python
Python走楼梯问题解决方法示例
2018/07/25 Python
python通过配置文件共享全局变量的实例
2019/01/11 Python
Django实现学生管理系统
2019/02/26 Python
python matplotlib库直方图绘制详解
2019/08/10 Python
python程序如何进行保存
2020/07/03 Python
HTML5 canvas实现雪花飘落特效
2016/03/08 HTML / CSS
HTML5边玩边学(2)基础绘图实现方法
2010/09/21 HTML / CSS
.NET初级开发工程师面试题(包括Javascript)
2012/08/22 面试题
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2016/01/06 面试题
财务工作个人求职的自我评价
2013/12/19 职场文书
学期评语大全
2014/04/30 职场文书
幼儿评语大全
2014/04/30 职场文书
活动主持人开场白
2015/05/28 职场文书
Django debug为True时,css加载失败的解决方案
2021/04/24 Python
Python爬取英雄联盟MSI直播间弹幕并生成词云图
2021/06/01 Python
python实现双向链表原理
2022/05/25 Python