在現代互聯網時代中,越來越多的網站采用了 “單點登錄” 來優化用戶的登陸體驗。這個時候就需要引入一個成熟的解決方案,OpenID就是其中之一。讓我們來看看如何在 PHP 中實現 OpenID。
在 PHP 中實現 OpenID 需要依賴一個 類庫 ,使用起來會方便很多。PHP 的社區有很多這樣的類庫,其中一個非常流行的是 Zend Framework 的 Auth_OpenID。該類庫支持 OpenID 1.1 和 2.0 規范,并擁有一系列的演示例子。
使用 Auth_OpenID 很簡單。首先,您需要將其引入您的代碼中:
require_once 'Auth/OpenID/Consumer.php'; require_once 'Auth/OpenID/FileStore.php';接下來,您需要初始化一個 Consumer 對象,它將負責實現 OpenID 的認證流程:
$store = new Auth_OpenID_FileStore('/tmp/openid'); $consumer = new Auth_OpenID_Consumer($store);上述代碼創建了一個基于文件的 OID 存儲實現,并將其傳遞給了 Consumer 構造函數。這里的 Consumer 對象將在后續的 OpenID 認證請求中使用。 下一步是處理來自用戶的認證請求。最常規的認證流程如下所示:
if (!isset($_GET['openid_mode'])) { // 第一步:用戶提供了 OpenID Identifier,您需要將其發送至 OpenID 服務器 $openid = $_GET['openid_identifier']; $auth_request = $consumer->begin($openid); if (!$auth_request) { die('無效的 OpenID'); } // 用戶選擇驗證的 OpenID 服務 $name = parse_url($openid); $name = $name['scheme'] . '://' . $name['host']; $id_select = sprintf( 'https://www.google.com/accounts/o8/id?id=%s', urlencode($name) ); $auth_request->addExtension( new Auth_OpenID_Extension_sreg(array('email', 'nickname'), null, 1, 0)); header('Location: ' . $auth_request->redirectURL($id_select, $return_to)); } elseif ($_GET['openid_mode'] == 'cancel') { // 用戶取消了 OpenID 認證請求 echo '用戶取消了認證'; } else { // 第三步:OpenID 服務器返回認證結果 $response = $consumer->complete($return_to); if ($response->status == Auth_OpenID_SUCCESS) { $openid = $response->getDisplayIdentifier(); $esc_identity = htmlentities($openid); header('Location: '.$esc_identity); } else { echo '錯誤:' . $response->message; } }此代碼段處理了 OpenID 認證請求,如果需要進行第一次 OpenID 認證請求,則將用戶 OpenID 發送至相應的 OpenID 服務器。OpenID 服務器將會返回一個認證頁面并要求用戶進行認證。一旦用戶成功認證,OpenID 服務器將重定向用戶到 return_to 參數制定的 URL。使用 Consumer 類庫,您的代碼將會自動監聽 OpenID 服務器發送的認證數據,解析 OpenID 返回信息,從而實現單點登錄。 Auth_OpenID 類庫是一份非常實用的類庫,它為 PHP 開發人員提供了一套便捷的工具,用于實現 OpenID 認證流程。如果您的網站需要使用單點登錄時,一定不能錯過這個優秀的類庫。