最終選擇了 Discuz 作為我們的論壇系統,主要是因為它提供了一套可用的 Passport API,來直接與我們現有系統進行整合。
下面摘錄 Discuz 文檔中的內容來說明整合原理,隨后的幾篇中,將詳細描述具體的整合過程。
假設已設置如下變量或參數
- 掛接 Discuz! Passport 的應用程序假設為一套 PHP 語言編寫的 CMS 系統
- Discuz! 的 URL 為 http://www.myforums.com
- 應用程序的 URL 為 http://www.mywebsite.com
- 應用程序的注冊頁面為 http://www.mywebsite.com/register.php
- 應用程序的登錄頁面為 http://www.mywebsite.com/login.php?action=login
- 應用程序的退出頁面為 http://www.mywebsite.com/login.php?action=logout
開啟通行證后的用戶登錄流程
- 如果用戶在論壇點擊“登錄”,則轉向到事先設置好的應用程序登錄頁面(http://www.mywebsite.com/login.php?action=login),并在登錄頁面的 URL 中加入參數 forward(加入 forward 后的鏈接例如 http://www.mywebsite.com/login.php?action=login&forward=http://www.myforums.com/index.php),用于在登錄后將用戶導向到指定的 URL。
- 應用程序收到此請求后,按照慣例生成表單,并增加一個表單變量,將 GET 方式傳遞過來的 forward 參數通過表單進行傳遞。
- 用戶在應用程序的表單中填寫登錄信息,并提交到應用程序的登錄驗證程序。應用程序驗證用戶提交的用戶名和密碼的合法性:
- 如果不通過:提示用戶名密碼錯誤,要求其返回上一頁重新填寫。
- 如果通過,需要進行如下操作:
- 設置自身 Cookie 或 Session,使得應用程序自身處于登錄狀態。
- 檢查表單中是否提交了 forward 變量,如有,則意味著登錄請求可能是由論壇而來,將此變量傳遞到后面的請求中。如沒有,自行生成 forward 變量,使得論壇登錄后能夠跳轉回到應用程序中。
- 通過 header('Location: http://www.myforums.com/api/passport.php?action=login&auth=xxx&forward=http://yyy&verify=zzz') 的方式,將登錄請求傳遞到論壇進行處理。其中 auth 用來將用戶信息與資料以特定的格式,加密傳遞給論壇,forward 用于告知論壇 Passport API 完成自身操作后轉向到的 URL 地址,verify 用于驗證前面兩個變量的有效性。auth、forward、verify 格式與結構將在后面進行說明。
- 設置自身 Cookie 或 Session,使得應用程序自身處于登錄狀態。
- 如果不通過:提示用戶名密碼錯誤,要求其返回上一頁重新填寫。
- Discuz! Passport API 在接收到由應用程序通過 header() 提交過來的請求后,進行如下操作:
- 根據 verify 判斷 auth 和 forward 變量是否合法,如合法則繼續,否則終止。
- 將 auth 根據既定算法解密,并還原成數組,數組的內容與格式將在后面進行說明。根據數組中的內容,檢查此用戶是否存在。如存在,則根據上述數組中的內容 UPDATE 論壇中相應的用戶資料。如不存在,則使用數組中的信息 INSERT 到論壇用戶資料表中。
- 論壇設置 Cookie 或 Session,使得論壇自身處于登錄狀態。
- 根據應用程序反饋的 forward 值,通過 header('Location: http://xxx') 的形式將頁面跳轉到 forward 變量指定的 URL。
- 根據 verify 判斷 auth 和 forward 變量是否合法,如合法則繼續,否則終止。
- 至此,登錄流程結束
開啟通行證后的用戶退出流程
- 如果用戶在論壇點擊“退出”,則轉向到事先設置好的應用程序退出頁面(http://www.mywebsite.com/login.php?action=logout),并在登錄頁面的 URL 中加入參數 forward(例如 http://www.mywebsite.com/login.php?action=login&forward=http://www.myforums.com/index.php),用于在退出后將用戶導向到指定的 URL。
- 應用程序收到此請求后,清除自身 Cookie 或 Session,使得應用程序自身處于非登錄狀態。
- 檢查是否提交了 forward 變量,如有,則意味著登錄請求可能是由論壇而來,將此變量傳遞到后面的請求中。如沒有,自行生成 forward 變量,使得論壇登錄后能夠跳轉回到應用程序中。
- 通過 header('Location: http://www.myforums.com/api/passport.php?action=logout&forward=http://yyy&verify=zzz') 的方式,將退出請求傳遞到論壇進行處理。其中 forward 用于告知論壇 Passport API 完成自身操作后轉向到的 URL 地址,verify 用于驗證 forward 變量的有效性。forward、verify 格式與結構將在后面進行說明。
- Discuz! Passport API 在接收到由應用程序通過 header() 提交過來的請求后,進行如下操作:
- 根據 verify 判斷 forward 變量是否合法,如合法則繼續,否則終止。
- 清楚論壇的 Cookie 或 Session,使得論壇自身處于非登錄狀態。
- 根據應用程序反饋的 forward 值,通過 header('Location: http://xxx') 的形式將頁面跳轉到 forward 變量指定的 URL。
- 根據 verify 判斷 forward 變量是否合法,如合法則繼續,否則終止。
- 至此,退出流程結束。
開啟通行證后的用戶注冊流程
- 如果用戶在論壇點擊“注冊”,則轉向到事先設置好的應用程序注冊頁面(http://www.mywebsite.com/register.php),并在注冊頁面的 URL 中加入參數 forward(例如 http://www.mywebsite.com/register.php?forward=http://www.myforums.com/index.php),用于在注冊后將用戶導向到指定的 URL
- 應用程序收到此請求后,按照慣例生成表單,并增加一個表單變量,將 GET 方式傳遞過來的 forward 參數通過表單進行傳遞
- 用戶在應用程序的表單中填寫注冊信息,并提交到應用程序的注冊驗證程序。應用程序驗證用戶提交信息的完整性和合法性:
- 如果不通過:提示其問題所在,要求其返回上一頁重新填寫
- 如果通過,需要進行如下操作:
- 將用戶資料插入到應用程序自身用戶數據庫中
- 設置自身 Cookie 或 Session,使得應用程序自身處于登錄狀態
- 檢查表單中是否提交了 forward 變量,如有,則意味著注冊請求可能是由論壇而來,將此變量傳遞到后面的請求中。如沒有,自行生成 forward 變量,使得論壇注冊后能夠跳轉回到應用程序中
- 通過 header('Location: http://www.myforums.com/api/passport.php?action=login&auth=xxx&forward=http://yyy&verify=zzz') 的方式,將注冊請求傳遞到論壇進行處理。其中 auth 用來將用戶信息與資料以特定的格式,加密傳遞給論壇,forward 用于告知論壇 Passport API 完成自身操作后轉向到的 URL 地址,verify 用于驗證前面兩個變量的有效性。auth、forward、verify 格式與結構將在后面進行說明
- 將用戶資料插入到應用程序自身用戶數據庫中
- 如果不通過:提示其問題所在,要求其返回上一頁重新填寫
- Discuz! Passport API 在接收到由應用程序通過 header() 提交過來的請求后,進行如下操作:
- 根據 verify 判斷 auth 和 forward 變量是否合法,如合法則繼續,否則終止
- 將 auth 根據既定算法解密,并還原成數組,數組的內容與格式將在后面進行說明。根據數組中的內容,檢查此用戶是否存在。如存在,則根據上述數組中的內容 UPDATE 論壇中相應的用戶資料。如不存在,則使用數組中的信息 INSERT 到論壇用戶資料表中
- 論壇設置 Cookie 或 Session,使得論壇自身處于登錄狀態
- 根據應用程序反饋的 forward 值,通過 header('Location: http://xxx') 的形式將頁面跳轉到 forward 變量指定的 URL
- 根據 verify 判斷 auth 和 forward 變量是否合法,如合法則繼續,否則終止
- 至此,注冊流程結束
本部分中,加下劃線顯示的部分,是需要對您的應用程序進行更改的部分,事實上,這部分更改會非常容易和方便。