Аутентификация Restful cakePHP 2.3

У меня есть два приложения CakePHP на 2 разных серверах. Одно приложение требуется для получения данных из первого; Мне удалось внедрить архитектуру Restful, но мне не удалось внедрить процедуру аутентификации для запросов, отправляемых сервером. Мне нужно пройти аутентификацию, чтобы обезопасить данные. Я смотрел в Интернете, но не могу заставить его работать. Может кто-нибудь указать мне на ресурс / учебник, который объясняет это подробно. В конечном итоге мне понадобится способ аутентификации моего сервера каждый раз, когда он отправляет запрос на другой сервер. Любая помощь будет оценена.

1 ответ

Решение

Я наконец заставил это работать после некоторого исследования; действительно, одно из решений - 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, чтобы понять протокол (в частности, часть получения авторизации), посмотреть, какой протокол (может отличаться от того, который я использовал), примените и адаптируйте к вашему случаю с помощью плагина.

Учебник здесь

Другие вопросы по тегам