2013-12-04 4 views
1

Я пытаюсь сгенерировать подпись для запроса OAuth. Вот как я это делаю:OAuth сгенерировать подпись

String toHash = URLEncoder.encode("POST&https://" + url + "&oauth_callback=oob&oauth_consumer_key=" + key + "&oauth_signature_method=HMAC-SHA1&oauth_timestamp=" + timeStamp + "&oauth_nonce=" + timeStamp); 

String hash = computeHmac(toHash, secret); 

...

public String computeHmac(String baseString, String key) 
    { 
     Mac mac = Mac.getInstance("HmacSHA1"); 
     SecretKeySpec secret = new SecretKeySpec(key.getBytes(), mac.getAlgorithm()); 
     mac.init(secret); 
     byte[] digest = mac.doFinal(baseString.getBytes()); 
     return new String(Base64.encodeBase64(digest)); 
    } 

Но сервер говорит мне, что подпись неверна. Что я делаю неправильно? Пиз помощь ...

ответ

3

В соответствии со спецификацией OAuth: базовая строка

подпись строится путем конкатенации вместе, в порядке, следующие HTTP элементы запроса:

  1. HTTP- метод запроса в верхнем регистре. Например: «HEAD», «GET», «POST» и т. Д. Если запрос использует настраиваемый метод HTTP, он должен быть закодирован (раздел 3.6).

  2. Символ "&" (код ASCII 38).

  3. URI базовой строки из раздела 3.4.1.2 после кодирования (раздел 3.6).

  4. Символ "&" (код ASCII 38).

  5. Параметры запроса, нормализованные в разделе 3.4.1.3.2, после кодирования (раздел 3.6).

В базовой строке некоторые символы не правильно закодированы и нормированы. Например:

https://    -> https%3A%2F%2F 
oauth_callback=oob -> oauth_callback%3Doob 
... 

Все подробности о струнной конструкции здесь: http://tools.ietf.org/html/rfc5849#section-3.4.1.1

+1

Спасибо за вашу помощь. Комбинированные инструкции по интернету по-прежнему крайне неясны в отношении того, что нормализуется, что кодируется и в каком порядке. Например; почему некоторые из символов «&» закодированы, а некоторые нет ... Оайт, я бы плюнул на тебя последним дыханием ... –

Смежные вопросы