0

我正在尝试使用 Oauth 进行验证。我的示例代码是:

ArrayList <NameValuePair> params = new ArrayList<NameValuePair>();
  boolean flag=false;
  URL url;

  String oauth_nonce="q14F5ApN4Ka5RJGbYgabXwMSZ4BxVrlNGedN9zoFAoi3rc7dpLjIgri1erAAriPu";
  String oauth_timestamp="1336069726";
  String signatureString =
    URLEncoder.encode("device_id=id_here")
    +URLEncoder.encode("&device_type=psw_here")
    +URLEncoder.encode("&oauth_consumer_key=consumer_key_here...&oauth_nonce=" +
      oauth_nonce+
      "&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1336069726&oauth_version=1.0");

  String percent_encoded_url = URLEncoder.encode("http://www.example.com");
  String signatureBaseString = "POST"+
    "&"+percent_encoded_url+
    "&"+signatureString;

  String oauth_signature=URLEncoder.encode(computeHmac(signatureBaseString, "aWAQTWR7VvHapaNhWBCL0VaUdGN2xzN4&"));

  String headerValue ="OAuth "+
    "oauth_consumer_key=\""+"consumer_key_here..."+"\","+
    "oauth_signature_method=\"HMAC-SHA1"+"\","+
    "oauth_signature=\""+oauth_signature+"\","+
    "oauth_timestamp=\"1336069726"+"\","+
    "oauth_nonce=\""+oauth_nonce+"\"," +        
    "oauth_version=\"1.0"+"\"";


  HttpPost httppost = new HttpPost("http://www.example.com/");

  httppost.setHeader("Content-Type","application/x-www-form-urlencoded");
  httppost.setHeader("Authorization",headerValue);
  HttpEntity httpentity = new UrlEncodedFormEntity(params);

  HttpClient httpclient = new DefaultHttpClient(clientConnectionManager, httpparams);

  StringBuilder sb = new StringBuilder();
  try {

   HttpResponse response = httpclient.execute(httppost);

当我发送请求时,它总是说“签名匹配错误”。我对Oauth一无所知。我不知道我错在哪里。有人可以指导我正确的方向吗?

4

1 回答 1

0

在我看来,您正在以正确的方式生成签名,但服务器以通用signature mismatch消息响应,因为:

首先,您不能对每个请求都使用相同的随机数。您需要为每个请求随机生成一个新的 nonce。

其次,对于每个请求,时间戳都必须是 UTC 的当前时间。如果正确实施 OAuth 提供程序,它将允许在不久的将来或过去的时间戳。所以确保你的时钟是正确的。

据我所知,您的签名生成看起来不错,至少在您尝试获取请求令牌时。试试上面的两点,让我知道它是怎么回事:)

于 2012-05-08T09:25:05.747 回答