У меня есть два приложения CakePHP на 2 разных серверах. Одно приложение требуется для получения данных из первого; Мне удалось внедрить архитектуру Restful, но мне не удалось внедрить процедуру аутентификации для запросов, отправляемых сервером. Мне нужно пройти аутентификацию, чтобы обезопасить данные. Я смотрел в Интернете, но не могу заставить его работать. Может кто-нибудь указать мне на ресурс / учебник, который объясняет это подробно.
В конечном итоге мне понадобится способ аутентификации моего сервера каждый раз, когда он отправляет запрос на другой сервер. Любая помощь будет оценена.
Я наконец заставил это работать после некоторого исследования; действительно, одно из решений — OAuth. Если вы столкнулись с той же проблемой, я могу посоветовать вам этот плагин сделано для CakePHP.
В деталях я поместил плагин OAuth в мой API-сервер и использовал его так же, как и для моего контроллера отдыха:
class RestObjectController extends AppController {
public $components = array('RequestHandler', 'OAuth.OAuth');
public $layout = FALSE;
public function token() {
$this->autoRender = false;
try {
$this->OAuth->grantAccessToken();
} catch (OAuth2ServerException $e) {
$e->sendHttpResponse();
}
}
public function index() {
$objects = $this->Object->find('all');
$this->set(array(
'objects' => $objects,
'_serialize' => array('objects')
));
}
Функция RestObject.token () — это то, что я бы назвал, чтобы получить токен доступа, который будет использоваться для предоставления мне доступа к ресурсам моего контроллера. (Обратите внимание, что, объявив OAuth в компонентах моего контроллера, все ресурсы в моем контроллере будут нуждаться в токене доступа, который будет доступен).
Поэтому на клиентском сервере я бы получил токен доступа следующим образом:
public function acquireAccessToken(){
$this->autoRender = FALSE;
App::uses('HttpSocket', 'Network/Http');
$link = API_SERVER."rest_objects/token";
$data = array(
'grant_type' => 'client_credentials',
'client_id' => 'xxxx',
'client_secret' => 'xxxx'
);
$response = $httpSocket->post($link, $data);
if($response->code == 200){
$data = json_decode($response->body, true);
return $data['access_token'];
}
return FALSE;
}
Это предполагает, что у вас уже есть настроенные клиенты, как описано в Плагин док (замените xxxx действительными значениями для учетных данных клиента). Когда у меня есть токен доступа, все, что мне нужно сделать, это использовать его следующим образом:
public function test(){
$this->layout = FALSE;
App::uses('HttpSocket', 'Network/Http');
$httpSocket = new HttpSocket();
if($access_token = $this->acquireAccessToken()){
$link = API_SERVER."rest_objects.json"; //For the index as e.g.
$data = array('access_token' => $access_token);
$response = $httpSocket->get($link, $data);
}
}
И вот оно у вас! Итак, начните с чтения Oauth Спецификация понять протокол (в частности, Получение авторизации часть), посмотрите, какой протокол (может отличаться от того, который я использовал), примените и адаптируйте к вашему случаю, используя Plugin
Других решений пока нет …