Bash Xero Private应用程序使用cURL获取发票-验证签名失败/错误500?
我正试图通过XeroAPI(一个简单的bash脚本和cURL)与我的Xero帐户通信。此外,我正在使用Xero Private应用程序,这意味着我已经生成了一个公钥/私钥对、上传到Xero的公钥和在我的过程中使用的私钥 按此处建议生成的密钥对: 以下是我的代码和思考过程 首先,我为OAuth请求创建参数。我知道Xero私人应用程序与OAuth1.0a配合使用,需要与RSA-SHA1签署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)
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