You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Xero API时非浏览器后端工作流的认证问题求助

问题解答

1. Xero后端非浏览器场景的认证方式

Xero支持两种无需浏览器OAuth2授权流程的认证方案,适配后端服务需求:

客户端凭证流(OAuth 2.0 Client Credentials Flow)

这是Xero官方推荐的现代方案,适用于应用需访问自身关联的单个Xero组织的场景,全程无需用户交互。核心逻辑是直接用客户端ID和密钥请求访问令牌,跳过用户授权步骤。

私有应用认证(Private App Authentication)

这是旧版方案,基于RSA签名完成认证,无需OAuth2流程。创建私有应用时需生成RSA密钥对,请求时用密钥签名即可。目前Xero虽引导用户转向OAuth2方案,但该方式仍可正常使用。

2. 你的代码错误原因(invalid_grant)

你当前使用的是OAuth2授权码流程,但代码逻辑存在关键错误:

  • $state是Xero用于防范CSRF攻击的随机值,并非授权码(code)
  • 授权码流程的正确链路是:用户跳转至$authorizationUrl完成授权 → Xero将code参数返回至你的redirectUri → 用真实的code调用getAccessToken

你直接把state当成code传入,自然会触发invalid_grant错误。

3. 客户端凭证流的PHP实现示例

如果采用客户端凭证流,基于league/oauth2-client的代码示例如下:

$provider = new \League\OAuth2\Client\Provider\GenericProvider([
    'clientId'                => config('services.xero_invoices.client_id'),
    'clientSecret'            => config('services.xero_invoices.client_secret'),
    'urlAccessToken'          => 'https://identity.xero.com/connect/token',
]);

// 请求客户端凭证令牌
$accessToken = $provider->getAccessToken('client_credentials', [
    'scope' => 'accounting.settings accounting.transactions accounting.contacts accounting.journals.read accounting.reports.read accounting.attachments'
]);

// 使用令牌访问API
$response = $provider->getAuthenticatedRequest(
    'GET',
    'https://api.xero.com/api.xro/2.0/Organisation',
    $accessToken
);

$organisation = $provider->getParsedResponse($response);

注意:使用客户端凭证流需先在Xero开发者平台将应用与目标组织关联,同时确保申请的权限(scope)已获批准。

内容的提问来源于stack exchange,提问作者Jon Hill

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 19:02:45