简而言之,我在域A上设置了Pharbicator,但是我必须在域B上实现依赖于Pharbicator的服务 .
所以这就是故事,我正在尝试使用Phabricator Conduit user.whoami
API收集信息,以查看当前用户是否已登录 . 但由于各种原因,我无法做到 . 我想知道这样做的正确方法是什么 .
我尝试了三种方法,但它们都没有用 . 这是我试过的
Method 1 :使用Ajax请求
我所做的只是使用api令牌发出POST Ajax请求
$.ajax({
url: 'http://127.0.0.1:8080/api/user.whoami',
method: 'POST',
cache: false,
data: 'api-token='+app.PHABRICATOR_APIKEY
}).done(function(response) {
console.dir(response);
}).fail(function(jqXHR, textStatus) {
console.log(textStatus);
});
此方法不起作用(如预期),因为它是CORS请求,并且Phabricator服务器没有 Access-Control-Allow-Origin
标头 .
虽然我可以添加 Access-Control-Allow-Origin
标头,但不知何故这需要修改Phabricator源代码,所以我认为这是我要做的最后一个解决方案 .
Method 2 :使用PHP作为代理和内部使用curl来请求它 . 所以整个请求就像 Client Browser <-> PHP Proxy Script <-> Phabricator
这个方法实际上能够发送请求并获得响应 . 但是信息是错误的,因为它只返回API密钥的用户 .
如果我理解正确, curl
没有我的浏览器会话,所以它无法真正知道我(Pharbricator)中的我(浏览器客户端) . 所以我假设API只会后退使用API密钥的信息,从而返回不是我想要的信息 .
Method 3 :使用Phabricator提供的PHP库 __phutil_library_init__.php
require_once '/var/www/html/phabricator/libphutil/src/__phutil_library_init__.php';
$api_token = PHABRICATOR_APIKEY;
$api_parameters = array();
$client = new ConduitClient('http://127.0.0.1:8080/');
$client->setConduitToken($api_token);
$result = $client->callMethodSynchronous('user.whoami', $api_parameters);
return $result;
这也没什么特别的,只是文档中代码的直接副本 . 但同样它只返回API密钥所属的用户 . 我认为它与方法2的行为方式相同 .
我想如果我以错误的方式理解Conduit API . 更重要的是,我想知道如何实现整个架构,以便它可以使用当前的浏览器会话收集信息 . 谢谢 .