我是Oauth的新手,我将oauth_access_token与Xero合作。 Web服务身份验证对我不起作用。 Xero返回以下错误消息“oauth_problem = signature_invalid& oauth_problem_advice =无法验证签名”。 生成的签名不正确,但生成它的正确方法是什么?
这是生成端点的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());
答案 0 :(得分: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/