日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Re:[转]如何基于discuz开发网站通行证的功能

發(fā)布時間:2025/5/22 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Re:[转]如何基于discuz开发网站通行证的功能 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

通行證是個大題目,說白了也就是如何維護客戶的會話,在php中所能用的方法無非幾種:

● Cookie
● Session
● POST或GET的方法傳值

一般中小型的單服務(wù)器應(yīng)用程序站點,如Discuz論壇,采用的cookie+session+mysql的方法來維持用戶會話。

考慮到網(wǎng)站規(guī)模和復(fù)雜性,例如多臺服務(wù)器多個應(yīng)用程序,例如163的通行證系統(tǒng),登陸成功后會在客戶端寫一個cookie,里面保存用戶名等信息。其他應(yīng)用程序,都是通過讀取這個Cookie重新將客戶帶入自己的會話中,重而實現(xiàn)通行證功能。163的這種做法不失為一種好辦法。

Discuz! Passport 接口技術(shù)文檔

從 Discuz! 4.0.0 RC4 版本開始,Discuz! 內(nèi)嵌了一個獨特的 Passport(通行證) 接口,利用此接口,用戶將很容易將論壇與其他應(yīng)用程序整合,而實現(xiàn)統(tǒng)一登錄與退出、用戶數(shù)據(jù)共享、積分同步等功能。可以整合的應(yīng)用程序包括內(nèi)容管理系統(tǒng)(CMS)、商城系統(tǒng)、游戲系統(tǒng)等等,如您對這方面功能有興趣或有需求,請繼續(xù)閱讀本文檔。

Discuz! Passport 的優(yōu)點

Discuz! Passport 系統(tǒng)使用了 Discuz! 獨有的技術(shù),并不等同于以往使用過的一些方法,與傳統(tǒng)的實現(xiàn)方式相比,具備(不限于)以下優(yōu)勢:

基于私有密匙的低相關(guān)性可逆加密算法,配合 MD5 校檢碼技術(shù),使得暴力破解或偽造幾乎不可能。
應(yīng)用程序可與論壇放置于不同的服務(wù)器及不同的域名下。可基于不同操作系統(tǒng)、不同程序語言和不同數(shù)據(jù)庫平臺,具備真正的平臺無關(guān)性。
不需要任何形式的數(shù)據(jù)庫連接、或強制把兩套應(yīng)用程序的數(shù)據(jù)放在同一數(shù)據(jù)庫甚至同一數(shù)據(jù)表中。論壇與應(yīng)用程序都有各自的用戶數(shù)據(jù)表,只是在需要時進行無縫同步操作。
對應(yīng)用程序的代碼改動簡便易行,可最快速的完成應(yīng)用程序與論壇間的整合。
Discuz! Passport 的局限

您在開始利用 Discuz! Passport 進行二次開發(fā)時,需要了解這個系統(tǒng)的局限性,以對未來的工作進行正確的評估與安排。

只能工作在用戶密碼不加密、可逆加密或 MD5 加密的情況下,否則論壇后臺無法登錄。
只能與一種應(yīng)用程序關(guān)聯(lián),即二方關(guān)聯(lián)。不能實現(xiàn)三方關(guān)聯(lián)或與更多的應(yīng)用程序進行關(guān)聯(lián)。
應(yīng)用程序需具有獨立的注冊、登錄、退出頁面和鏈接,否則需要自行修改論壇中的相應(yīng)表單或程序。
由于論壇的注冊人數(shù)可能很多,例如百萬級以上,且應(yīng)用程序和論壇間的用戶數(shù)據(jù)是同步的,因此要求應(yīng)用程序能夠穩(wěn)定的負載大量用戶的訪問。


Discuz! Passport 原理與流程
假設(shè)已設(shè)置如下變量或參數(shù)
掛接 Discuz! Passport 的應(yīng)用程序假設(shè)為一套 PHP 語言編寫的 CMS 系統(tǒng)
Discuz! 的 URL 為
http://www.myforums.com
應(yīng)用程序的 URL 為
http://www.mywebsite.com
應(yīng)用程序的注冊頁面為
http://www.mywebsite.com/register.php
應(yīng)用程序的登錄頁面為
http://www.mywebsite.com/login.php?action=login
應(yīng)用程序的退出頁面為
http://www.mywebsite.com/login.php?action=logout
開啟通行證后的用戶登錄流程


如果用戶在論壇點擊“登錄”,則轉(zhuǎn)向到事先設(shè)置好的應(yīng)用程序登錄頁面(http://www.mywebsite.com/login.php?action=login),并在登錄頁面的 URL 中加入?yún)?shù) forward(加入 forward 后的鏈接例如 http://www.mywebsite.com/login.p ... orums.com/index.php),用于在登錄后將用戶導(dǎo)向到指定的 URL。

應(yīng)用程序收到此請求后,按照慣例生成表單,并增加一個表單變量 ,將 GET 方式傳遞過來的 forward 參數(shù)通過表單進行傳遞。
用戶在應(yīng)用程序的表單中填寫登錄信息,并提交到應(yīng)用程序的登錄驗證程序。應(yīng)用程序驗證用戶提交的用戶名和密碼的合法性:


如果不通過:提示用戶名密碼錯誤,要求其返回上一頁重新填寫。


如果通過,需要進行如下操作:
設(shè)置自身 Cookie 或 Session,使得應(yīng)用程序自身處于登錄狀態(tài)。
檢查表單中是否提交了 forward 變量,如有,則意味著登錄請求可能是由論壇而來,將此變量傳遞到后面的請求中;如沒有,自行生成 forward 變量,使得論壇登錄后能夠跳轉(zhuǎn)回到應(yīng)用程序中。


通過 header('Location: http://www.myforums.com/api/pass ... /yyy&verify=zzz') 的方式,將登錄請求傳遞到論壇進行處理。其中 auth 用來將用戶信息與資料以特定的格式,加密傳遞給論壇,forward 用于告知論壇 Passport API 完成自身操作后轉(zhuǎn)向到的 URL 地址,verify 用于驗證前面兩個變量的有效性。auth、forward、verify 格式與結(jié)構(gòu)將在后面進行說明。

Discuz! Passport API 在接收到由應(yīng)用程序通過 header() 提交過來的請求后,進行如下操作:
根據(jù) verify 判斷 auth 和 forward 變量是否合法,如合法則繼續(xù),否則終止。
將 auth 根據(jù)既定算法解密,并還原成數(shù)組,數(shù)組的內(nèi)容與格式將在后面進行說明。根據(jù)數(shù)組中的內(nèi)容,檢查此用戶是否存在。如存在,則根據(jù)上述數(shù)組中的內(nèi)容 UPDATE 論壇中相應(yīng)的用戶資料;如不存在,則使用數(shù)組中的信息 INSERT 到論壇用戶資料表中。


論壇設(shè)置 Cookie 或 Session,使得論壇自身處于登錄狀態(tài)。
根據(jù)應(yīng)用程序反饋的 forward 值,通過 header('Location:
http://xxx') 的形式將頁面跳轉(zhuǎn)到 forward 變量指定的 URL。

至此,登錄流程結(jié)束
開啟通行證后的用戶退出流程

如果用戶在論壇點擊“退出”,則轉(zhuǎn)向到事先設(shè)置好的應(yīng)用程序退出頁面(
http://www.mywebsite.com/login.php?action=logout),并在登錄頁面的 URL 中加入?yún)?shù) forward(例如 http://www.mywebsite.com/login.p ... orums.com/index.php),用于在退出后將用戶導(dǎo)向到指定的 URL。
應(yīng)用程序收到此請求后,清除自身 Cookie 或 Session,使得應(yīng)用程序自身處于非登錄狀態(tài)。
檢查是否提交了 forward 變量,如有,則意味著登錄請求可能是由論壇而來,將此變量傳遞到后面的請求中;如沒有,自行生成 forward 變量,使得論壇登錄后能夠跳轉(zhuǎn)回到應(yīng)用程序中。


通過 header('Location: http://www.myforums.com/api/pass ... /yyy&verify=zzz') 的方式,將退出請求傳遞到論壇進行處理。其中 forward 用于告知論壇 Passport API 完成自身操作后轉(zhuǎn)向到的 URL 地址,verify 用于驗證 forward 變量的有效性。forward、verify 格式與結(jié)構(gòu)將在后面進行說明。


Discuz! Passport API 在接收到由應(yīng)用程序通過 header() 提交過來的請求后,進行如下操作:
根據(jù) verify 判斷 forward 變量是否合法,如合法則繼續(xù),否則終止。 清楚論壇的 Cookie 或 Session,使得論壇自身處于非登錄狀態(tài)。
根據(jù)應(yīng)用程序反饋的 forward 值,通過 header('Location:
http://xxx') 的形式將頁面跳轉(zhuǎn)到 forward 變量指定的 URL。


至此,退出流程結(jié)束。
開啟通行證后的用戶注冊流程

如果用戶在論壇點擊“注冊”,則轉(zhuǎn)向到事先設(shè)置好的應(yīng)用程序注冊頁面(http://www.mywebsite.com/register.php),并在注冊頁面的 URL 中加入?yún)?shù) forward(例如 http://www.mywebsite.com/registe ... orums.com/index.php),用于在注冊后將用戶導(dǎo)向到指定的 URL
應(yīng)用程序收到此請求后,按照慣例生成表單,并增加一個表單變量 ,將 GET 方式傳遞過來的 forward 參數(shù)通過表單進行傳遞用戶在應(yīng)用程序的表單中填寫注冊信息,并提交到應(yīng)用程序的注冊驗證程序。應(yīng)用程序驗證用戶提交信息的完整性和合法性:
如果不通過:提示其問題所在,要求其返回上一頁重新填寫
如果通過,需要進行如下操作:
將用戶資料插入到應(yīng)用程序自身用戶數(shù)據(jù)庫中
設(shè)置自身 Cookie 或 Session,使得應(yīng)用程序自身處于登錄狀態(tài)

檢查表單中是否提交了 forward 變量,如有,則意味著注冊請求可能是由論壇而來,將此變量傳遞到后面的請求中;如沒有,自行生成 forward 變量,使得論壇注冊后能夠跳轉(zhuǎn)回到應(yīng)用程序中


通過 header('Location: http://www.myforums.com/api/pass ... /yyy&verify=zzz') 的方式,將注冊請求傳遞到論壇進行處理。其中 auth 用來將用戶信息與資料以特定的格式,加密傳遞給論壇,forward 用于告知論壇 Passport API 完成自身操作后轉(zhuǎn)向到的 URL 地址,verify 用于驗證前面兩個變量的有效性。auth、forward、verify 格式與結(jié)構(gòu)將在后面進行說明

?

Discuz! Passport API 在接收到由應(yīng)用程序通過 header() 提交過來的請求后,進行如下操作:


根據(jù) verify 判斷 auth 和 forward 變量是否合法,如合法則繼續(xù),否則終止


將 auth 根據(jù)既定算法解密,并還原成數(shù)組,數(shù)組的內(nèi)容與格式將在后面進行說明。根據(jù)數(shù)組中的內(nèi)容,檢查此用戶是否存在。如存在,則根據(jù)上述數(shù)組中的內(nèi)容 UPDATE 論壇中相應(yīng)的用戶資料;如不存在,則使用數(shù)組中的信息 INSERT 到論壇用戶資料表中


論壇設(shè)置 Cookie 或 Session,使得論壇自身處于登錄狀態(tài)


根據(jù)應(yīng)用程序反饋的 forward 值,通過 header('Location: http://xxx') 的形式將頁面跳轉(zhuǎn)到 forward 變量指定的 URL

?

至此,注冊流程結(jié)束
本部分中,加下劃線顯示的部分,是需要對您的應(yīng)用程序進行更改的部分,事實上,這部分更改會非常容易和方便。


Discuz! Passport 參數(shù)規(guī)格與加密方式


私有密匙(passport_key)

由于一些關(guān)鍵參數(shù)采用了 GET 方式進行傳遞,即便兩次 header 跳轉(zhuǎn)并不會直接將鏈接顯示在外面,但我們?nèi)匀粚﹃P(guān)鍵的參數(shù)進行了加密,私有密匙共有兩個作用:其一是供下面提到的可逆加密算法(AzDGCrypt)進行數(shù)據(jù)的加解密;其二是生成不可逆驗證字串(verify),以防止關(guān)鍵信息被偽造。

在啟用 Discuz! Passort 后,您需要在應(yīng)用程序和 Discuz! 后臺配置兩處私有密匙,這兩處的內(nèi)容必須完全相同,這樣應(yīng)用程序和論壇之間才能正常通信。私有密匙決定了加密算法的強度,因此密匙長度請不要小于 10 個字節(jié),并包含字母、數(shù)字和符號,以保證系統(tǒng)的安全。

加密算法

Discuz! Passport 采用 Azerbaijan Development Group(AzDG)開發(fā)的可逆加密算法 AzDGCrypt 對用戶資料進行加密。如提供正確的私有密匙,可通過本加密算法對數(shù)據(jù)進行加密及解密,因此只要保證私有密匙的保密性,即可確保數(shù)據(jù)傳遞過程中的安全。以下為 Discuz! Passport 中應(yīng)用到的可逆加密算法,為了生成可以被 Discuz! Passport 正確解密的 auth 字串,需要將如下函數(shù)放置于應(yīng)用程序中,并可在登錄及注冊時調(diào)用。

passport_encrypt()是加密函數(shù),用法為 passport_encrypt($txt, $key),其中 $txt 是待加密的字串,$key 是私有密匙。
passport_decrypt()是解密函數(shù),用法為 passport_decrypt($txt, $key),其中 $txt 是加密后的字串,$key 是私有密匙。


/**
* Passport 加密函數(shù)
*
* @param string 等待加密的原字串
* @param string 私有密匙(用于解密和加密)
*
* @return string 原字串經(jīng)過私有密匙加密后的結(jié)果
*/
function passport_encrypt($txt, $key) {

// 使用隨機數(shù)發(fā)生器產(chǎn)生 0~32000 的值并 MD5()
srand((double)microtime() * 1000000);
$encrypt_key = md5(rand(0, 32000));

// 變量初始化
$ctr = 0;
$tmp = '';

// for 循環(huán),$i 為從 0 開始,到小于 $txt 字串長度的整數(shù)
for($i = 0; $i < strlen($txt); $i++) {
// 如果 $ctr = $encrypt_key 的長度,則 $ctr 清零
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
// $tmp 字串在末尾增加兩位,其第一位內(nèi)容為 $encrypt_key 的第 $ctr 位,
// 第二位內(nèi)容為 $txt 的第 $i 位與 $encrypt_key 的 $ctr 位取異或。然后 $ctr = $ctr + 1
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
}

// 返回結(jié)果,結(jié)果為 passport_key() 函數(shù)返回值的 base65 編碼結(jié)果
return base64_encode(passport_key($tmp, $key));

}

/**
* Passport 解密函數(shù)
*
* @param string 加密后的字串
* @param string 私有密匙(用于解密和加密)
*
* @return string 字串經(jīng)過私有密匙解密后的結(jié)果
*/
function passport_decrypt($txt, $key) {

// $txt 的結(jié)果為加密后的字串經(jīng)過 base64 解碼,然后與私有密匙一起,
// 經(jīng)過 passport_key() 函數(shù)處理后的返回值
$txt = passport_key(base64_decode($txt), $key);

// 變量初始化
$tmp = '';

// for 循環(huán),$i 為從 0 開始,到小于 $txt 字串長度的整數(shù)
for ($i = 0; $i < strlen($txt); $i++) {
// $tmp 字串在末尾增加一位,其內(nèi)容為 $txt 的第 $i 位,
// 與 $txt 的第 $i + 1 位取異或。然后 $i = $i + 1
$tmp .= $txt[$i] ^ $txt[++$i];
}

// 返回 $tmp 的值作為結(jié)果
return $tmp;

}

/**
* Passport 密匙處理函數(shù)
*
* @param string 待加密或待解密的字串
* @param string 私有密匙(用于解密和加密)
*
* @return string 處理后的密匙
*/
function passport_key($txt, $encrypt_key) {

// 將 $encrypt_key 賦為 $encrypt_key 經(jīng) md5() 后的值
$encrypt_key = md5($encrypt_key);

// 變量初始化
$ctr = 0;
$tmp = '';

// for 循環(huán),$i 為從 0 開始,到小于 $txt 字串長度的整數(shù)
for($i = 0; $i < strlen($txt); $i++) {
// 如果 $ctr = $encrypt_key 的長度,則 $ctr 清零
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
// $tmp 字串在末尾增加一位,其內(nèi)容為 $txt 的第 $i 位,
// 與 $encrypt_key 的第 $ctr + 1 位取異或。然后 $ctr = $ctr + 1
$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
}

// 返回 $tmp 的值作為結(jié)果
return $tmp;

}

/**
* Passport 信息(數(shù)組)編碼函數(shù)
*
* @param array 待編碼的數(shù)組
*
* @return string 數(shù)組經(jīng)編碼后的字串
*/
function passport_encode($array) {

// 數(shù)組變量初始化
$arrayenc = array();

// 遍歷數(shù)組 $array,其中 $key 為當前元素的下標,$val 為其對應(yīng)的值
foreach($array as $key => $val) {
// $arrayenc 數(shù)組增加一個元素,其內(nèi)容為 "$key=經(jīng)過 urlencode() 后的 $val 值"
$arrayenc[] = $key.'='.urlencode($val);
}

// 返回以 "&" 連接的 $arrayenc 的值(implode),例如 $arrayenc = array('aa', 'bb', 'cc', 'dd'),
// 則 implode('&', $arrayenc) 后的結(jié)果為 ”aa&bb&cc&dd"
return implode('&', $arrayenc);

}

?


passport_encode()是將數(shù)組轉(zhuǎn)換合成為字串形式存儲的函數(shù):變量名和數(shù)值之間用等號連接,如果數(shù)值包含特殊字符,使用 urlencode() 將其轉(zhuǎn)碼;多個變量間使用 & 分割。例如原始數(shù)組內(nèi)容為 array('username' => 'abc', 'email' => 'my+discuz@gmail.com'),經(jīng)過 passport_encode() 編碼后結(jié)果為 username=abc&email=my%2Bdiscuz%40gmail.com。

信息字串(auth)

應(yīng)用程序在收到登錄或注冊請求,并讀取到用戶資料后,請按如下的要求將用戶資料及部分其他信息存放于一個數(shù)組之中。數(shù)組各鍵值的含義為:

?

cookietime
應(yīng)用程序保存該用戶登錄記錄的時間,可為非負整數(shù),單位秒,Discuz! Passport 收到此參數(shù)后,會設(shè)置同樣的 Cookie 過期時間,這樣應(yīng)用程序和論壇可以保證同樣的登錄有效性。如不傳遞此參數(shù),或參數(shù)數(shù)值不正確,則 Discuz! Passport 按照 0 設(shè)置 Cookie 有效期。


time
應(yīng)用程序所在服務(wù)器當前時間(9 或 10 位數(shù)字 Unix Timestamp),此參數(shù)用于 Discuz! 所在服務(wù)器當前時間進行比對,如果早于當前時間超過若干秒(取決于 Discuz! Passport 中的“驗證字串有效期”設(shè)定),則視為本 auth 內(nèi)容無效,避免此URL被人得知后可能的安全問題。


username
用戶登錄或注冊的用戶名。Discuz! 的注冊用戶名規(guī)則為:
長度 1~15 個字符,不得為空
不得為 c:concon、游客(gb2312 或 big5 內(nèi)碼)、Guest
不得包含 (,)、(*)、(")、([TAB])、([SPACE])、([r])、([n])、(<)、(>)、(&)其中之一

如果應(yīng)用程序提交過來的用戶名不符合上述規(guī)則,Passport 將自動去處其中的特殊字符,將過濾后的結(jié)果寫入數(shù)據(jù)庫中。


password
用戶密碼經(jīng) MD5 不可逆加密后的值。如果此密碼使用非 MD5 加密,則應(yīng)用程序和 Passport 不能正常關(guān)聯(lián)和使用。


email
用戶 Email 地址(50 個字節(jié)以內(nèi))。


isadmin
當前用戶是否是應(yīng)用程序的最高管理員,1=是,0=否。最高管理員的權(quán)限,將同步到論壇中去,其他下級管理員的身份將不進行同步,而由最高管理員分別在不同的系統(tǒng)中進行設(shè)置。

credits
當前用戶在應(yīng)用程序中的積分值,范圍 -2147483648 到 2147483647,如果 Discuz! Passport 中設(shè)置了目標積分項,則用戶登錄時,Passport 會把應(yīng)用程序傳遞過來的 credits 值同步到指定的論壇的指定積分項目中


gender
當前用戶的性別,1=男,2=女,0=未知。


bday
當前用戶的生日,格式 yyyy-mm-dd。


regip
當前用戶注冊時的 IP 地址。


regdate
當前用戶注冊的時間(9 或 10 位數(shù)字 Unix Timestamp)。


nickname
當前用戶的昵稱(30 個字節(jié)以內(nèi),如傳遞此參數(shù),必須打開相應(yīng)用戶組的昵稱權(quán)限,否則用戶在控制面板中提交個人資料時,會導(dǎo)致昵稱失效)。


site
當前用戶的主頁地址(包含http://)。


qq
當前用戶的 QQ 號碼。


ICQ
當前用戶的 ICQ 賬號。


msn
當前用戶的 MSN Messenger 賬號。


yahoo
當前用戶的 Yahoo! Messanger 賬號。
以上參數(shù)中,以黑體下劃線顯示的 time、username、password、email 是必須傳遞的參數(shù),缺少上述參數(shù) Passport 將無法正常工作;其他的參數(shù)是可選的,如果不傳遞某些參數(shù),則 Passport 會進行識別,自動不更新沒有傳遞的參數(shù)所在的字段;所有數(shù)值,請?zhí)峁┰贾?#xff0c;而非經(jīng)過反斜線轉(zhuǎn)義(addslashes)后的結(jié)果。

把上述信息存放于數(shù)組中,假定為如下的形式:


$member = array
(
'cookietime' => 31536000,
'time' => 1117415922,
'username' => 'Abcd',
'password' => 'e2fc714c4727ee9395f324cd2e7f331f',
'email' => 'abcd@efgh.com',
'credits' => 123,
'regip' => '210.120.222.111',
'regdate' => '1012752000',
'msn' => 'email@hotmail.com'
);




將其經(jīng)過如下的加密變換,即可得到 auth 的值:


$auth = passport_encrypt(passport_encode($member), $passport_key);




其中,passport_encode() 在前文已做了說明,用于將數(shù)組內(nèi)容存放于特定的格式,$passport_key 是私有密匙。

切記:由于 $auth 中可能含有等號、加號等特殊字符,請將 $auth 經(jīng)過 rawurlencode() 編碼后再在 URL 中傳遞,否則可能會產(chǎn)生問題。

導(dǎo)向字串(forward)

導(dǎo)向字串用于通知 Discuz! Passport 在完成自身操作后,返回到哪一個 URL 地址,例如 http://www.myforums.com/forumdisplay.php?fid=2。如果 forward 為空,則默認導(dǎo)向到應(yīng)用程序的首頁

切記:由于 $forward 中可能含有冒號、問號、等號等特殊字符,請將 $forward 經(jīng)過 rawurlencode() 編碼后再在 URL 中傳遞,否則可能會產(chǎn)生問題。

驗證字串(verify)

驗證字串用戶檢驗 auth 和 forward 兩個參數(shù)的合法性,避免非法構(gòu)造參數(shù)進行破壞的可能。無論 auth 和 forward 變量是否存在,驗證字串(verify)的值均為:


$verify = md5($action.$auth.$forward.$passport_key);




其中,$action 是當前執(zhí)行的 Passport 操作,如 login 等等;$auth 是用戶信息加密后,并經(jīng) rawurlencode() 之前的內(nèi)容;$forward 是經(jīng) rawurlencode() 前的導(dǎo)向字串;$passport_key 是私有密匙。如果 verify 的值不匹配,則 Passport 拒絕進行下一步操作。


Discuz! Passport 設(shè)置與啟用


內(nèi)置關(guān)聯(lián)

Discuz! 以戰(zhàn)略合作的方式,與業(yè)內(nèi)知名的產(chǎn)品實現(xiàn)了 Passport 關(guān)聯(lián),目前內(nèi)置了 SiteEngine 建站引擎(http://www.siteengine.net)和 Shopex 通用型網(wǎng)上商店系統(tǒng)(http://www.shopex.cn)的相關(guān)接口,這樣用戶只須透過在兩套軟件中簡單的設(shè)置,即可開啟這些關(guān)聯(lián)。

其他應(yīng)用程序

由于 Discuz! Passport 的高可擴展性和平臺無關(guān)性,使得您可以參照前文的說明,稍稍改動小部分的代碼,便將任何 B/S 模式的應(yīng)用程序與 Discuz! 進行關(guān)聯(lián)。

參數(shù)設(shè)置

您可以在 Discuz! 系統(tǒng)設(shè)置中,看到相應(yīng)的通行證設(shè)置功能,在 Discuz! 合作伙伴的軟件中,也可以找到這些設(shè)置入口。相關(guān)的操作已比較簡單,在此不再詳細敘述。

特別說明

如果您先運營了論壇,后與其他應(yīng)用程序啟用了 Passport 關(guān)聯(lián),由于之前論壇中的用戶數(shù)據(jù)沒有同步,您需要先寫一個導(dǎo)入程序,將論壇的用戶數(shù)據(jù)導(dǎo)入到應(yīng)用程序的用戶表中,否則以往在論壇注冊的用戶將無法通過 Passport 登錄。已成功關(guān)聯(lián)后新注冊的用戶無此問題。

在開啟了 Discuz! 通行證后,您仍然可以通過 logging.php?action=login 這個鏈接來登錄論壇,以備調(diào)試之用,但頁面上顯示的鏈接將改為應(yīng)用程序的登錄 URL。注意:開啟通行證后,建議您通過 Discuz! 選項關(guān)閉論壇本身的注冊功能,以免用戶通過論壇注冊而產(chǎn)生無法同步的問題。

您可以在 Discuz! 的 api/passport.php 找到 Discuz! Passport 的全部源程序,您也許通過他更好的理解 Passport 的原理,更快的完成應(yīng)用程序與 Discuz! 之間的整合。


典型錯誤提示


Illegal request

非法請求,當驗證字串 verify 不匹配時會產(chǎn)生此提示。可能是應(yīng)用程序與 Discuz! 配置的私有密匙不同,或是通過 URL 傳遞前,未將必要的參數(shù)(如 auth、forward 等)進行 URL 編碼,也有可能是使用了經(jīng)過 URL 編碼的參數(shù)值用來計算 verify 的 md5 值造成。以 PHP 語言為例,正確的代碼應(yīng)當是類似于的如下的格式:


$action = 'login';
$auth = passport_encrypt(passport_encode($autharray), $passport_key);
$forward = 'http://www.discuz.net/index.php';
$verify = md5($action.$auth.$forward.$passport_key);

header("Location: http://www.discuz.net/api/passport.php".
"?action=$action".
"&auth=".rawurlencode($auth).
"&forward=".rawurlencode($forward).
"&verify=$verify");




Lack of required parameters

auth 內(nèi)容解密后,缺少必要的信息 time、username、password、email。

Request expired

請求過期。當前服務(wù)器時間與應(yīng)用程序提交過來的 time 之差大于 Discuz! Passport 中設(shè)置的請求有效期。可能是使用以往的代碼非法嘗試,也可能是由于應(yīng)用程序和 Discuz! 論壇所在的兩臺服務(wù)器,時間設(shè)置有誤造成。

Invalid action

沒有指定 Passport 所執(zhí)行的 action。

轉(zhuǎn)載于:https://www.cnblogs.com/zhangh/archive/2007/11/08/952991.html

總結(jié)

以上是生活随笔為你收集整理的Re:[转]如何基于discuz开发网站通行证的功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。