我在两台不同的服务器上有两个cakePHP应用程序。需要一个应用程序才能从第一个应用程序获取数据;我已成功将Restful架构放在适当的位置,但我未能对服务器发送的请求实施身份验证过程。我需要进行身份验证以保护数据。我在网上环顾四周,但似乎无法让它发挥作用。任何人都可以向我指出一个资源/教程,详细解释这一点。 我最终需要的是每次向其他服务器发送请求时对我的服务器进行身份验证的方法。任何帮助,将不胜感激。
答案 0 :(得分:1)
经过一番研究后我终于开始工作了;确实其中一个解决方案是OAuth。如果您遇到同样的问题,我可以建议您为CakePHP制作this Plugin。 详细地说,我所做的是将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()来获取一个Access令牌,该令牌将用于访问我的控制器中的Resources。 (请注意,通过在我的控制器组件中声明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部分),看看哪个协议(可以与我使用的协议不同)适用并通过使用{适应您的情况{3}}