@@ -66,43 +66,42 @@ public OAuthSignatureCalculatorInstance() throws NoSuchAlgorithmException {
6666 }
6767
6868public void sign (ConsumerKey consumerAuth ,RequestToken userAuth ,Request request ,RequestBuilderBase <?>requestBuilder )throws InvalidKeyException {
69- String nonce =generateNonce ();
69+ String percentEncodedNonce =generatePercentEncodedNonce ();
7070long timestamp =generateTimestamp ();
71- sign (consumerAuth ,userAuth ,request ,requestBuilder ,nonce ,timestamp );
71+ sign (consumerAuth ,userAuth ,request ,requestBuilder ,percentEncodedNonce ,timestamp );
7272 }
7373
74- private String generateNonce () {
74+ private String generatePercentEncodedNonce () {
7575ThreadLocalRandom .current ().nextBytes (nonceBuffer );
7676// let's use base64 encoding over hex, slightly more compact than hex or decimals
77- return Base64 .encode (nonceBuffer );
77+ return Utf8UrlEncoder . percentEncodeQueryElement ( Base64 .encode (nonceBuffer ) );
7878 }
7979
8080private static long generateTimestamp () {
8181return System .currentTimeMillis () /1000L ;
8282 }
8383
84- void sign (ConsumerKey consumerAuth ,RequestToken userAuth ,Request request ,RequestBuilderBase <?>requestBuilder ,String nonce ,long timestamp )
85- throws InvalidKeyException {
86- String signature =calculateSignature (consumerAuth ,userAuth ,request ,timestamp ,nonce );
87- String headerValue =constructAuthHeader (consumerAuth ,userAuth ,signature ,nonce ,timestamp );
84+ void sign (ConsumerKey consumerAuth ,RequestToken userAuth ,Request request ,RequestBuilderBase <?>requestBuilder ,String percentEncodedNonce ,long timestamp )throws InvalidKeyException {
85+ String signature =calculateSignature (consumerAuth ,userAuth ,request ,timestamp ,percentEncodedNonce );
86+ String headerValue =constructAuthHeader (consumerAuth ,userAuth ,signature ,percentEncodedNonce ,timestamp );
8887requestBuilder .setHeader (HttpHeaderNames .AUTHORIZATION ,headerValue );
8988 }
9089
91- String calculateSignature (ConsumerKey consumerAuth ,RequestToken userAuth ,Request request ,long oauthTimestamp ,String nonce )throws InvalidKeyException {
90+ String calculateSignature (ConsumerKey consumerAuth ,RequestToken userAuth ,Request request ,long oauthTimestamp ,String percentEncodedNonce )throws InvalidKeyException {
9291
93- StringBuilder sb =signatureBaseString (consumerAuth ,userAuth ,request ,oauthTimestamp ,nonce );
92+ StringBuilder sb =signatureBaseString (consumerAuth ,userAuth ,request ,oauthTimestamp ,percentEncodedNonce );
9493
9594ByteBuffer rawBase =StringUtils .charSequence2ByteBuffer (sb ,UTF_8 );
9695byte []rawSignature =digest (consumerAuth ,userAuth ,rawBase );
9796// and finally, base64 encoded... phew!
9897return Base64 .encode (rawSignature );
9998 }
10099
101- StringBuilder signatureBaseString (ConsumerKey consumerAuth ,RequestToken userAuth ,Request request ,long oauthTimestamp ,String nonce ) {
100+ StringBuilder signatureBaseString (ConsumerKey consumerAuth ,RequestToken userAuth ,Request request ,long oauthTimestamp ,String percentEncodedNonce ) {
102101
103102// beware: must generate first as we're using pooled StringBuilder
104103String baseUrl =request .getUri ().toBaseUrl ();
105- String encodedParams =encodedParams (consumerAuth ,userAuth ,oauthTimestamp ,nonce ,request .getFormParams (),request .getQueryParams ());
104+ String encodedParams =encodedParams (consumerAuth ,userAuth ,oauthTimestamp ,percentEncodedNonce ,request .getFormParams (),request .getQueryParams ());
106105
107106StringBuilder sb =StringBuilderPool .DEFAULT .stringBuilder ();
108107sb .append (request .getMethod ());// POST / GET etc (nothing to URL encode)
@@ -115,16 +114,17 @@ StringBuilder signatureBaseString(ConsumerKey consumerAuth, RequestToken userAut
115114return sb ;
116115 }
117116
118- private String encodedParams (ConsumerKey consumerAuth ,RequestToken userAuth ,long oauthTimestamp ,String nonce ,List <Param >formParams ,List <Param >queryParams ) {
117+ private String encodedParams (ConsumerKey consumerAuth ,RequestToken userAuth ,long oauthTimestamp ,String percentEncodedNonce ,List <Param >formParams ,List <Param >queryParams ) {
119118
120119parameters .reset ();
121120
122121/**
123122 * List of all query and form parameters added to this request; needed for calculating request signature
124123 */
125124// start with standard OAuth parameters we need
126- parameters .add (KEY_OAUTH_CONSUMER_KEY ,consumerAuth .getPercentEncodedKey ())
127- .add (KEY_OAUTH_NONCE ,Utf8UrlEncoder .percentEncodeQueryElement (nonce )).add (KEY_OAUTH_SIGNATURE_METHOD ,OAUTH_SIGNATURE_METHOD )
125+ parameters .add (KEY_OAUTH_CONSUMER_KEY ,consumerAuth .getPercentEncodedKey ())//
126+ .add (KEY_OAUTH_NONCE ,percentEncodedNonce )
127+ .add (KEY_OAUTH_SIGNATURE_METHOD ,OAUTH_SIGNATURE_METHOD )//
128128 .add (KEY_OAUTH_TIMESTAMP ,String .valueOf (oauthTimestamp ));
129129if (userAuth .getKey () !=null ) {
130130parameters .add (KEY_OAUTH_TOKEN ,userAuth .getPercentEncodedKey ());
@@ -170,7 +170,7 @@ private byte[] digest(ConsumerKey consumerAuth, RequestToken userAuth, ByteBuffe
170170return mac .doFinal ();
171171 }
172172
173- String constructAuthHeader (ConsumerKey consumerAuth ,RequestToken userAuth ,String signature ,String nonce ,long oauthTimestamp ) {
173+ String constructAuthHeader (ConsumerKey consumerAuth ,RequestToken userAuth ,String signature ,String percentEncodedNonce ,long oauthTimestamp ) {
174174StringBuilder sb =StringBuilderPool .DEFAULT .stringBuilder ();
175175sb .append ("OAuth " );
176176sb .append (KEY_OAUTH_CONSUMER_KEY ).append ("=\" " ).append (consumerAuth .getPercentEncodedKey ()).append ("\" , " );
@@ -184,10 +184,7 @@ String constructAuthHeader(ConsumerKey consumerAuth, RequestToken userAuth, Stri
184184Utf8UrlEncoder .encodeAndAppendPercentEncoded (sb ,signature ).append ("\" , " );
185185sb .append (KEY_OAUTH_TIMESTAMP ).append ("=\" " ).append (oauthTimestamp ).append ("\" , " );
186186
187- // also: nonce may contain things that need URL encoding (esp. when using base64):
188- sb .append (KEY_OAUTH_NONCE ).append ("=\" " );
189- Utf8UrlEncoder .encodeAndAppendPercentEncoded (sb ,nonce );
190- sb .append ("\" , " );
187+ sb .append (KEY_OAUTH_NONCE ).append ("=\" " ).append (percentEncodedNonce ).append ("\" , " );
191188
192189sb .append (KEY_OAUTH_VERSION ).append ("=\" " ).append (OAUTH_VERSION_1_0 ).append ("\" " );
193190return sb .toString ();