2

我是 Oauth 的新手,我希望让 oauth_access_token 与 Xero 一起工作。Web 服务身份验证对我不起作用。Xero 返回以下错误消息“oauth_problem=signature_invalid&oauth_problem_advice=Failed to validate signature”。生成的签名不正确,但是生成它的正确方法是什么?

这是生成端点的 APEX 代码。怎么了?

Http h = new Http();
String consumer_key='XXX';
Long tmp=(System.now().getTime()/1000);

Blob isItCorrect = Crypto.generateMac('HMacSHA1', Blob.valueOf('https://api.xero.com/api.xro/2.0'), Blob.valueOf(consumer_key));
String signature= EncodingUtil.urlEncode(EncodingUtil.base64Encode(isItCorrect), 'UTF-8');

// Try to get access token
HttpRequest req = new HttpRequest();
req.setEndpoint('https://api.xero.com/oauth/RequestToken?oauth_consumer_key='+consumer_key+
        '&oauth_signature_method=RSA-SHA1'+
        '&oauth_signature='+signature+
        '&oauth_timestamp='+tmp+ '&oauth_nonce='+tmp+'&oauth_version=1.0&scope=https%3A%2F%2Fapi.xero.com%2Fapi.xro%2F2.0');
req.setMethod('GET');

// Send the request, and return a response
HttpResponse res = h.send(req);
System.debug('~~~ '+res.getBody());

It generates following Endpoint: Endpoint= https://api.xero.com/oauth/RequestToken?oauth_consumer_key=ICSP7Y5K2TG7RIIC6Y7R7KLC1AHWYC&oauth_signature_method=RSA-SHA1&oauth_signature=gWP02y2EIatw4xilTvd5Iq3e0%2Fw%3D&oauth_timestamp=1372123781&oauth_nonce=1372123781&oauth_version=1.0&scope=https%3A%2F%2Fapi. xero.com%2Fapi.xro%2F2.0

4

1 回答 1

1

顺便说一句:我从未与 salesforce 合作过,所以我不确定是否有更好的方法来利用平台上现有的 oauth 工作,现在很少 需要自己编写所有 oauth 签名的东西,而且很 容易犯了一个错误,但这里是]

我认为您的签名基本字符串不正确。

据我所知,您只是通过https://api.xero.com/api.xro/2.0执行 HMAC-SHA1

如果您在此处阅读 OAuth 规范:http: //oauth.net/core/1.0/#anchor14您需要构造以下基本字符串(基于上述请求)

GET&https%3A%2F%2Fapi.xero.com%2Foauth%2Frequesttoken&oauth_consumer_key%3DCONSUMER_KEY%26oauth_nonce (等等,只需将除 oauth_consumer 之外的所有查询参数附加为 url 编码的键 = 值对,按字母顺序排列)

然后您需要使用键 CONSUMER_KEY&CONSUMER_SECRET 创建散列(CONSUMER_KEY 和 CONSUMER_SECRET 都应根据 OAuth 规范进行参数编码)

那应该给你一个有效的签名..

编辑:我发现这个库可能会有所帮助:https ://code.google.com/p/sfdc-oauth-playground/

于 2013-06-29T02:46:45.060 回答