Jakarta Commons Codec による Base64符号の末尾に改行が付加される件について
Amazon の Web API (Product Advertising API) が、最近 クエリーに署名を要求するようになったので、Javaで書かれた手元のアプリを修正した。
サンプルが与えられているのでまずはこれをコピペした。
http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.html?AuthJavaSampleSig2.html
エラー
しかしうまく動かなかった。エラーが返ってくる:
<?xml version="1.0"?> <ItemLookupErrorResponse xmlns="http://ecs.amazonaws.com/doc/2009-01-06/"> <Error> <Code>SignatureDoesNotMatch</Code> <Message>The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.</Message> </Error> <RequestID>********-****-****-****-************</RequestID> </ItemLookupErrorResponse>
原因
コード中、次の部分は、jakarta の commons codec のクラスを使って BASE64エンコードをしているが、
Base64 encoder = new Base64(); signature = new String(encoder.encode(rawHmac));
ここで、signature (署名を格納する変数) の末尾に改行が追加されてしまい、署名がおかしくなる。
修正
Base64 encoder = new Base64(); signature = new String(encoder.encode(rawHmac)).trim();
と修正した。