Bash Xero Private应用程序使用cURL获取发票-验证签名失败/错误500?

Bash Xero Private应用程序使用cURL获取发票-验证签名失败/错误500?,bash,curl,openssl,xero-api,oauth-1.0a,Bash,Curl,Openssl,Xero Api,Oauth 1.0a,我正试图通过XeroAPI(一个简单的bash脚本和cURL)与我的Xero帐户通信。此外,我正在使用Xero Private应用程序,这意味着我已经生成了一个公钥/私钥对、上传到Xero的公钥和在我的过程中使用的私钥 按此处建议生成的密钥对: 以下是我的代码和思考过程 首先,我为OAuth请求创建参数。我知道Xero私人应用程序与OAuth1.0a配合使用,需要与RSA-SHA1签署 oauth_consumer_key="my_key" oauth_nonce="$(($(date +%s)

我正试图通过XeroAPI(一个简单的bash脚本和cURL)与我的Xero帐户通信。此外,我正在使用Xero Private应用程序,这意味着我已经生成了一个公钥/私钥对、上传到Xero的公钥和在我的过程中使用的私钥

按此处建议生成的密钥对:

以下是我的代码和思考过程

首先,我为OAuth请求创建参数。我知道Xero私人应用程序与OAuth1.0a配合使用,需要与RSA-SHA1签署

oauth_consumer_key="my_key"
oauth_nonce="$(($(date +%s) - 10000))"
oauth_signature_method="RSA-SHA1"
oauth_timestamp="$(date +%s)"
oauth_token="my_key"
oauth_version="1.0"
现在,我着重于生成OAuth签名,如中所述。我确保使用
Method
(我称之为
verb
)、
URL
Params
创建一个基本字符串。我确保
Params
按名称排序。此外,在与
连接之前,我对这些值进行URL_编码

verb=GET
url=https://api.xero.com/api.xro/2.0/Invoices/243216c5-369e-4056-ac67-05388f86dc81
params=oauth_consumer_key=$oauth_consumer_key\&oauth_nonce=$oauth_nonce\&oauth_signature_method=$oauth_signature_method\&oauth_timestamp=$oauth_timestamp\&oauth_token=$oauth_token\&oauth_version=$oauth_version
baseString=$(urlencode $verb)\&$(urlencode $url)\&$(urlencode $params)
echo$baseString
返回
GET&https%3A%2F%2Fapi.xero.com%2Fapi.xro%2F2.0%2FInvoices%2Fe4d08842-29fc-4228-8227-8661e0f93ea3&oauth_消费者密钥%*%26oauth_nonce%3D1523125307%26oauth_签名_方法%3DRSA-SHA1%26oauth_时间戳%3D1523135308%26oauth_令牌%*%26oauth_版本%3D1.0

urlencode函数:

function urlencode() {
    echo -n "$1" | perl -MURI::Escape -ne 'print uri_escape($_)'
}
我使用OpenSSL对
基本字符串进行签名,如下所示

oauth_signature=$(echo -n "$baseString" | openssl dgst -sha1 -sign "C:\path\to\keys\privatekey.pem" | openssl enc -A -base64)
echo $oauth_signature
现在,我使用相同的参数创建授权头,但包括刚刚生成的签名

auth_header="Authorization: OAuth oauth_consumer_key=\"$oauth_consumer_key\", oauth_nonce=\"$oauth_nonce\", oauth_signature=\"$oauth_signature\", oauth_signature_method=\"$oauth_signature_method\", oauth_timestamp=\"$oauth_timestamp\", oauth_token=\"$oauth_token\", oauth_version=\"$oauth_version\"" 
echo$auth_头
返回
Authorization:OAuth-OAuth\u consumer\u key=“*”、OAuth\u nonce=“1523124975”、OAuth\u签名=“*”、OAuth\u签名方法=“RSA-SHA1”、OAuth\u timestamp=“1523134975”、OAuth\u令牌=“*”、OAuth\u版本=“1.0”

最后,我通过cURL发送一个GET请求,以获取特定的发票

curl -G "https://api.xero.com/api.xro/2.0/Invoices/243216c5-369e-4056-ac67-05388f86dc81" -H "$auth_header"
我收到

oauth_problem=signature_invalid&oauth_problem_advice=Failed%20to%20validate%20signature
我希望有一个带有发票的JSON响应,或者有什么东西告诉我发票不存在

我觉得我正确地遵循了这些步骤。嗯,我想签名有问题。要么是签名的内容格式不正确,要么是RSA-SHA1有问题?我不知所措。如果有任何反馈,我将不胜感激

编辑:多亏了@rustyskates,我修正了一些错误,但现在我得到了:

500
未知错误异常
Xero中发生错误。检查API状态页面http://status.developer.xero.com 用于当前服务状态。联系API支持团队,网址为api@xero.com需要更多的帮助。

这看起来仍然是一个问题,因为Xero没有报告操作问题,许多其他人似乎也经历过这种情况。

最后一步是在将oauth_签名值添加到授权标头之前直接对其进行url编码。一旦你这样做了,你就会是金黄色的。

Zeruno,你能粘贴echo$baseString和echo$auth_头的输出,删除用户密钥吗?@rustyskates当然,以下是
$echo$baseString
GET&https%3A%2F%2Fapi.xero.com%2Fapi.xro%2F2.0%2Fapi%2Fe4d08842-29fc-4228-8227-8661e0f93ea3&
的示例和
$echo$auth\u头
授权:OAuth OAuth\u消费者密钥=“*”、OAuth\u nonce=“15231245”、OAuth\u签名=“*”、OAuth\u签名方法=“RSA-SHA1”,oauth_timestamp=“1523134975”,oauth_token=“*”,oauth_version=“1.0”
看起来$baseString中缺少参数?我必须指出,在生成baseString时,我犯了一个愚蠢的错误,我已经纠正了(将很快更新),现在我可以从Xero获得一个结果-错误500:/
oauth_problem=signature_invalid&oauth_problem_advice=Failed%20to%20validate%20signature