discuz Passport 通行證 整合筆記_php技巧

來源:互聯網
上載者:User
太簡單了,但時間長了,記不得,浪費我半小時找資料,深刻體會好記性不如爛筆頭!!今天把passport文擋貼上,防止以後忘記!!記住,網上找到自己需要的資料也要耗時間的!!!!!!


Passport 通行證 整合

第一篇:整合原理

請注意: 整合不成功可能造成的後果-----dz論壇無法登入,無法管理
解決辦法:
第一步: 到dz的資料庫表cdb_settings 找到下面這幾行修改為
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);

}
//=========================================================================
//===========================拷貝結束======================================
?>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.