discuz Passport 通行证 整合笔记

  太简单了,但时间长了,记不得,浪费我半小时找资料,深刻体会好记性不如烂笔头!!今天把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);

  }

  //=========================================================================

  //===========================拷贝结束======================================

  ?>