经过一番研究,我终于让它工作了;确实,解决方案之一是 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