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

余談ですが、私はセールスフォースと仕事をしたことがないので、プラットフォームで既存の 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 に答える