使用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
相关产品推荐
相关产品推荐

