У меня определены два класса аутентификации.
В моем index.php я определил следующее
$r = new Restler();
$r->addAuthenticationClass('APIKeyAuth');
$r->addAuthenticationClass('OAUTH2Server');
Затем я защищаю один из остальных методов для APIKeyAuth
/**
* @access protected
* @class APIKeyAuth{@requires apikey}
*/
public function .......etc
Если я отлаживаю его, он проходит первый шаг, и $ authObj (см. Код ниже из restler.php)
быть APIKeyAuth. Он проверяет __isAllowed и возвращает true … что хорошо.
Затем он, однако, проходит через OAUTH2Server (который, по моему мнению, не должен, как метод остальных
был украшен для использования APIKeyAuth.
Таким образом, он проходит, и __isAllowed в OAUTH2Server имеет значение false, поэтому пользователь получит несанкционированный ответ.
foreach ($this->authClasses as $authClass) {
$authObj = Scope::get($authClass);
if (!method_exists($authObj,
Defaults::$authenticationMethod)
) {
throw new RestException (
500, 'Authentication Class ' .
'should implement iAuthenticate');
} elseif (
!$authObj->{Defaults::$authenticationMethod}()
) {
throw new RestException(401);
}
}
Нужно ли изменять сервер OAUTH2, чтобы проверить, использует ли он ключ API, и добавить логику? (кажется, неправильный подход).
Restler до RC5 обрабатывает классы аутентификации последовательно, это означает, что все классы аутентификации должны возвращать true, чтобы пройти защищенный вызов API.
Начиная с RC6 это изменилось на параллельное, что означает, что любой из классов аутентификации может разрешить доступ к защищенному API
Других решений пока нет …