简而言之,我在域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 . 更重要的是,我想知道如何实现整个架构,以便它可以使用当前的浏览器会话收集信息 . 谢谢 .