OAuth生成签名

时间:2013-12-04 21:30:03

标签: android hash oauth signature

我正在尝试为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));
    }

但是服务器告诉我签名是错误的。我做错了什么?皮斯帮忙......

1 个答案:

答案 0 :(得分:3)

根据OAuth规范:

  

签名基本字符串是通过连接在一起构建的,   按顺序,以下HTTP请求元素:

     
      
  1. 大写的HTTP请求方法。例如:“HEAD”,      “GET”,“POST”等。如果请求使用自定义HTTP方法,则为      必须编码(第3.6节)。

  2.   
  3. “&”字符(ASCII码38)。

  4.   
  5. 编码后的3.4.1.2节中的基本字符串URI      (第3.6节)。

  6.   
  7. “&”字符(ASCII码38)。

  8.   
  9. 请求参数在3.4.1.3.2节之后归一化      正在编码(第3.6节)。

  10.   

在基本字符串中,某些字符未正确编码和规范化。例如:

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

有关字符串构造的所有详细信息均在此处:http://tools.ietf.org/html/rfc5849#section-3.4.1.1