使用PHP/Guzzle验证对Xero API的私有应用程序的请求


Authenticating a request to a private application for the Xero API using PHP/Guzzle

我正在尝试将我公司的在线商店(用php/Laravel编写)与Xero集成,以便我可以为每个订单创建发票。为此,我创建了一个私人Xero应用程序,生成了Oauth认证所需的证书,并将其添加到Xero应用程序中,这样我现在就有了我的消费者密钥和秘密。

我看了看官方的php包装器,发现它非常过时,不适合集成到我的应用程序中,所以,考虑到Xero交互的数量很少,我想我应该尝试直接调用API。

我正在使用Guzzle和Guzzle Oauth订阅者,但我正在努力发送正确身份验证的请求。

鉴于我的Xero应用程序是私有的,下面的段落应该适用于我的请求(如在Xero开发区域提到的):

注意,对于私有应用程序,消费者令牌和密钥也用作访问令牌和密钥。

所以我像这样创建请求:

$stack = HandlerStack::create();
$middleware = new Oauth1([
    'consumer_key'    => config('services.xero.key'),
    'consumer_secret' => config('services.xero.secret'),
    'signature_method' => Oauth1::SIGNATURE_METHOD_RSA,
]);
$stack->push($middleware);
$client = new Client([
    'base_uri' => 'https://api.xero.com/api.xro/2.0/',
    'handler'  => $stack,
]);
$res = $client->request('GET', 'Contacts');
dd($res);

然而,我得到以下异常抛出:

[GuzzleHttp '例外' ClientException]
客户端错误:GET https://api.xero.com/api.xro/2.0/Contacts result在401 Unauthorized响应中:
oauth_problem = consumer_key_unknown& oauth_problem_advice =消费者% 20键% 20并非% 20公认% 20

据我所知,我已经正确设置了Xero应用程序并生成了消费者密钥和秘密,但我似乎无法调试这个。

关于如何提出恰当的请求有什么建议吗?

我和你有同样的问题。这对我来说很有效:

$middleware = new Oauth1([
   'consumer_key' => config('services.xero.key'),
   'token' => config('services.xero.key'),
   'private_key_file' => config('services.xero.path_to_my_private_key.pem'),
   'private_key_passphrase' => config('services.xero.private_key_passphrase'),
   'signature_method' => Oauth1::SIGNATURE_METHOD_RSA,
]);
$stack = GuzzleHttp'HandlerStack::create();
$stack->push($middleware);
$options = [
    'base_uri' => 'https://api.xero.com/',
    'handler' => $stack
];
$this->apiClient = new GuzzleHttp'Client($options);

在https://developer.xero.com/documentation/auth-and-limits/private-applications中声明"消费者密钥也被用作访问令牌。

对于任何为此而挣扎的人,就像我过去几天一样,从matks得到的解决方案对我不起作用。

在检查Guzzle Oauth1文档后,我注意到在$options中你需要设置一个'auth'选项,像这样

$options = [
        'base_uri' => 'https://api.xero.com/api.xro/2.0/',
        'handler' => $stack,
        'auth' => 'oauth'
    ];

在我添加了这个选项之后,一切都很好。

完整的代码是这样的

$middleware = new Oauth1([
       'consumer_key' => config('xero.oauth.consumer_key'),
       'token' => config('xero.oauth.consumer_key'),
       'private_key_file' => storage_path(config('xero.oauth.rsa_private_key')),
       'private_key_passphrase' => config('xero.oauth.rsa_private_key_passphrase'),
       'signature_method' => Oauth1::SIGNATURE_METHOD_RSA,
    ]);
    $stack = HandlerStack::create();
    $stack->push($middleware);
    $options = [
        'base_uri' => 'https://api.xero.com/api.xro/2.0/',
        'handler' => $stack,
        'auth' => 'oauth'
    ];
    $this->client = new Client($options);