我正在嘗試Restler爲我的新項目構建web api。
其中一個要求是簡單認證。
我找到很好的例子對SO https://stackoverflow.com/a/7969250/965722但它是Restler 2. 使用手動我設法這個類轉換爲Restler 3.0Restler 3.0基本身份驗證
<?php
class BasicAuthentication implements iAuthenticate
{
const REALM = 'Restricted API';
public static $currentUser;
public static $requires = 'user';
public static $role = 'user';
public function __isAllowed()
{
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);
$roles = array('12345' => 'user', '67890' => 'admin');
if (!isset($pass) || !array_key_exists($pass, $roles))
{
return false;
}
static ::$role = $roles[$pass];
Resources::$accessControlFunction = 'AccessControl::verifyAccess';
return static ::$requires == static ::$role || static ::$role == 'admin';
}
header('WWW-Authenticate: Basic realm="' . self::REALM . '"');
throw new RestException(401, 'Basic Authentication Required');
}
/**
* @access private
*/
public static function verifyAccess(array $m)
{
$requires = isset($m['class']['AccessControl']['properties']['requires']) ? $m['class']['AccessControl']['properties']['requires'] : false;
return $requires ? static ::$role == 'admin' || static ::$role == $requires : true;
}
}
?>
我的示例API類看起來像這樣:
<?php
class Api
{
/**
* @url GET
* @url GET hello
* @url GET hello/{to}
*/
function hello($to = 'world')
{
return "Hello $to!";
}
/**
* @access protected
* @class AccessControl {@requires user}
*/
public function user()
{
return "protected api, only user and admin can access";
}
/**
* @access protected
* @class AccessControl {@requires admin}
*/
public function admin()
{
return "protected api, only admin can access";
}
}
任何我的index.php
<?php
require_once 'vendor/restler.php';
use Luracast\Restler\Restler;
$r = new Restler();
$r->addAPIClass('Api', '');
$r->addAuthenticationClass('BasicAuthentication');
$r->handle();
?>
當我導航到我的網頁標準登錄和密碼錶單顯示,但即使我把正確的用戶名和密碼都沒有發生 - 登錄窗口重新打開。
我可能犯了一些愚蠢的錯誤,但我找不到它。 這是我第一次嘗試基本認證,所以請親切。
我需要在服務器上進行一些特殊配置嗎?
編輯:
它看起來像我需要一些特殊的配置,因爲我的服務器運行的CGI/FastCGI的。
我試過從此評論添加代碼:http://php.net/manual/en/features.http-auth.php#106285 但我無法正確配置.htaccess。
這是默認Restler htaccess文件:
Options -MultiViews
DirectoryIndex index.php
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^$ index.php [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
<IfModule mod_php5.c>
php_flag display_errors Off
</IfModule>
這些線由解決方法需要從以前的鏈接工作:
RewriteEngine on
RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last]
如何既結合?
@Misiiu你在這一行的意思是:類BasicAuthentication實現IAuthenticate進行的,而不是IAuthenticate進行你不得不使用iUseAuthentication –
@ZeeshanJan我已經編輯我的答案。我已經發布了我的BasicAuthentication類和實現'iUseAuthentication'的示例API類。所有你必須做的是當你創建Restler實例時你必須添加'$ r-> addAuthenticationClass('BasicAuthentication');'。希望這可以幫助! :) – Misiu