使用PHP / Guzzle对Xero API的私有应用程序进行身份验证

时间:2016-11-09 10:58:34

标签: php authentication oauth xero-api

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

我查看了官方的php包装器,发现它已经过时且不适合集成到我的应用程序中,因此,考虑到Xero交互量很小,我想我会尝试直接调用API。 / p>

我正在使用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结果   在401 Unauthorized回复中:
  oauth_problem = consumer_key_unknown&安培; oauth_problem_advice =消费者%20key%20was%20not%20recognised

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

关于如何提出正确请求的任何建议?

2 个答案:

答案 0 :(得分:0)

我和你一样有同样的问题。这对我有用:

$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中声明"消费者密钥也用作访问令牌。私人应用程序不使用消费者秘密。"这就是我发现这个配置的方式。

答案 1 :(得分:0)

对于任何为此苦苦挣扎的人来说,就像我过去几天来那样,而matts的解决方案对我来说却无济于事。

检查了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);