2011-10-26 60 views
2

我正在使用Luracast restler,並試圖通過實現iAuthenticate接口來實現一些身份驗證。Luracast Restler身份驗證

事情是,我的身份驗證代碼需要查詢我的數據庫以檢索用戶私鑰。該私鑰總是在url請求中提供(哈希)。

我想打開一個數據庫連接到每個請求,所以我需要將db連接變量傳遞給我的類實現iAuthenticate和處理所有請求的其他類。但我無法弄清楚如何將變量傳遞給實現iAuthenticate的類。

可能嗎?

僅供參考,這裏有提前the luracast examples

THKS。

回答

7

使用您的API和驗證類

單DB連接創建一個名爲config.php一個PHP文件,把你所有的數據庫信息與數據庫連接,並選擇沿。

例如

<?php 
define('DB_SERVER', 'localhost'); 
define('DB_USER', 'root'); 
define('DB_PASSWORD', 'password'); 
define('DB_NAME', 'mysql_db'); 
//initalize connection to use everywhere 
//including auth class and api classes 
mysql_connect(DB_SERVER, DB_USER, DB_PASSWORD); 
mysql_select_db(DB_NAME); 

包括雙方身份驗證類和API類使用require_once此功能,如(爲簡單起見,我這裏沒有加密的密碼)

<?php 
require_once 'config.php'; 
class BasicAuthentication implements iAuthenticate{ 
    const REALM = 'Restricted API'; 
    public static $currentUser; 

    function __isAuthenticated(){ 
     if(isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])){ 
      $user = $_SERVER['PHP_AUTH_USER']; 
      $pass = $_SERVER['PHP_AUTH_PW']; 
      $user = mysql_real_escape_string($user); 
      $pass = mysql_real_escape_string($pass); 

      mysql_query("UPDATE `login` SET logged=NOW() 
       WHERE user='$user' AND pass='$pass'"); 
      // echo mysql_affected_rows(); 
      if(mysql_affected_rows()>0){ 
       self::$currentUser = $user; 
       return TRUE; 
      } 
     } 
     header('WWW-Authenticate: Basic realm="'.self::REALM.'"'); 
     throw new RestException(401, 'Basic Authentication Required'); 
    } 
} 

你的API類的東西可以有一個查詢相同數據庫的受保護方法,它可以是使用相同連接返回數據的不同表。爲了簡單起見,我在這裏使用相同的表格。

<?php 
require_once 'config.php'; 
class Simple { 
    function index() { 
     return 'public api result'; 
    } 
    protected function restricted() { 
     $query = mysql_query("SELECT * FROM login"); 
     $result = array(); 
     while ($row = mysql_fetch_assoc($query)) { 
      $result[]=$row; 
     } 
     return $result; 
    } 
} 

使用require_once可以確保PHP文件包括只在第一次遇到一次。即使我們停止使用AUTH類後者我們的API將繼續發揮作用

假設下面的SQL來創建我們的數據庫表

-- 
-- Database: `mysql_db` 
-- 

-- 
-- Table structure for table `login` 
-- 

CREATE TABLE IF NOT EXISTS `login` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `logged` datetime DEFAULT NULL, 
    `user` varchar(10) DEFAULT NULL, 
    `pass` varchar(10) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; 

-- 
-- Dumping data for table `login` 
-- 

INSERT INTO `login` (`id`, `logged`, `user`, `pass`) VALUES 
(1, '2011-11-01 22:50:05', 'arul', 'mypass'), 
(2, '2011-11-01 23:43:25', 'paulo', 'hispass'); 

並用以下

<?php 
require_once '../../restler/restler.php'; 

#set autoloader 
#do not use spl_autoload_register with out parameter 
#it will disable the autoloading of formats 
spl_autoload_register('spl_autoload'); 

$r = new Restler(); 

$r->addAPIClass('Simple',''); 
$r->addAuthenticationClass('BasicAuthentication'); 
$r->handle(); 
在index.php

結果

如果您在瀏覽器中打開index.php/restricted並輸入正確的用戶名和密碼組合,則會看到以下內容爲t他的結果:)

[ 
    { 
    "id": "1", 
    "logged": "2011-11-01 22:50:05", 
    "user": "arul", 
    "pass": "mypass" 
    }, 
    { 
    "id": "2", 
    "logged": "2011-11-01 23:43:25", 
    "user": "paulo", 
    "pass": "hispass" 
    } 
] 
+0

嘿,這很酷!雖然還有一個問題...你會如何將上述方法擴展到AWS身份驗證(http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/index.html?RESTAuthentication.html),其中包含一個日期標題(例如「日期:星期四,2008年8月14日17時08分48秒」),對其進行散列驗證信息? – pkluz

+0

感謝分享! – Misiu

1

想通了!

echo mysql_affected_rows(); 

此行導致輸出爲文本/ html格式。評論說,和我很好去。