【问题标题】:Authenticate Restful cakePHP 2.3认证 Restful cakePHP 2.3
【发布时间】:2015-11-10 09:19:40
【问题描述】:

我在两台不同的服务器上有两个 cakePHP 应用程序。需要一个应用程序从第一个应用程序获取数据;我已成功部署 Restful 架构,但未能对服务器发送的请求实施身份验证程序。我需要进行身份验证以保护数据。我在网上环顾四周,但似乎无法正常工作。谁能指出我详细解释这一点的资源/教程。 我最终需要的是一种在每次向另一台服务器发送请求时对我的服务器进行身份验证的方法。任何帮助,将不胜感激。

【问题讨论】:

标签: php rest cakephp cakephp-2.3 restful-authentication


【解决方案1】:

经过一番研究,我终于让它工作了;确实,解决方案之一是 OAuth。如果您遇到同样的问题,我可以建议您 this Plugin 为 CakePHP 制作。 具体来说,我所做的是将 OAuth 插件放入我的 API 服务器,然后我将它用于我的 restful 控制器:

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;
}

这假设您已经按照Plugin Doc 中的说明设置了客户端(将 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 Specification 以了解协议(特别是 Obtaining Authorization 部分),查看适用的协议(可能与我使用的协议不同)并使用 Plugin 适应您的情况

Tutorial Here

【讨论】:

    猜你喜欢
    • 2011-12-30
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 2012-05-10
    • 2011-04-05
    • 2011-04-01
    • 2015-11-05
    相关资源
    最近更新 更多