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