2012-01-24 3 views
1

Я пытаюсь использовать Xuath с Tumblr. Я уже отправил по электронной почте команду поддержки Tumblr, чтобы включить Xuath для моего приложения, и они обязались. Однако, пытаясь получить ключ пользователя и секрет, я постоянно получаю ошибку «400: Плохой запрос». Я не мог найти способ отладки плохого запроса.Tumblr Xauth Android - 400 Ошибка запроса

Ниже приведен код: (Примечание- этот код был разработан с отрывками, доступных через сеть)

private final String CONSUMER_KEY = "mdMFLrprZGnRw4XO736GXcXP8huxaxTT5z1nlxDK38GbyWlW38"; 
private final String CONSUMER_SECRET = "VOpRNqKSLjhD3bR8vw4MorXgGc7lkT2FtBZr9xDchA5AvfscUI"; 

private final String ACCESS_URL = "https://www.tumblr.com/oauth/access_token"; 
private final String XAUTH_MODE = "client_auth"; 
private final String SIGNATURE_METHOD = "HMAC-SHA1"; 
private final String OAUTH_VERSION = "1.0"; 


private EditText mEmailAddress; 
private EditText mPassword; 
private Button mLogInButton; 



@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.tumblr_layout); 

    mEmailAddress = (EditText) findViewById(R.id.email_tumblr); 
    mPassword = (EditText) findViewById(R.id.passowrd_tumblr); 
    mLogInButton = (Button) findViewById(R.id.tumblr_login_button); 

    mLogInButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String email = mEmailAddress.getText().toString(); 
      String password= mPassword.getText().toString(); 



      String oauth_nonce = a64BitRandomString(); 
      String oauth_timestamp = getTimeStamp(); 


      String signatureBaseString = 
        "POST" 
        + "&" 
        + URLEncoder.encode(ACCESS_URL) 
        + "&" 
        + URLEncoder.encode("oauth_consumer_key=" + URLEncoder.encode(CONSUMER_KEY)) 
        + URLEncoder.encode("&" + "oauth_nonce=" + URLEncoder.encode(oauth_nonce)) 
        + URLEncoder.encode("&" + "oauth_signature_method=" + URLEncoder.encode(SIGNATURE_METHOD)) 
        + URLEncoder.encode("&" + "oauth_timestamp=" + URLEncoder.encode(oauth_timestamp)) 
        + URLEncoder.encode("&" + "oauth_version=" + URLEncoder.encode(OAUTH_VERSION)) 
        + URLEncoder.encode("&" + "x_auth_username=" + URLEncoder.encode(email)) 
        + URLEncoder.encode("&" + "x_auth_password=" + URLEncoder.encode(password)) 
        + URLEncoder.encode("&" + "x_auth_mode=" + URLEncoder.encode(XAUTH_MODE)); 


      String oauth_signature= getSignature(signatureBaseString, "HmacSHA1", 
        CONSUMER_SECRET+"&"); 

      try { 
       String headerValue = "OAuth " + 
         "oauth_nonce=\""+oauth_nonce+"\"," + 
         "oauth_signature_method=\""+SIGNATURE_METHOD+"\"," + 
         "oauth_timestamp=\""+oauth_timestamp+"\"," + 
         "oauth_consumer_key=\""+CONSUMER_KEY+"\"," + 
         "oauth_signature=\""+URLEncoder.encode(oauth_signature,"UTF-8")+"\"," + 
         "oauth_version=\""+OAUTH_VERSION+"\""; 

       HttpPost httppost = new HttpPost(ACCESS_URL 
         +"?x_auth_username="+URLEncoder.encode(email) 
         +"&x_auth_password="+URLEncoder.encode(password) 
         +"&x_auth_mode="+URLEncoder.encode(XAUTH_MODE));  

       httppost.setHeader("Host","https://www.tumblr.com"); 
       httppost.setHeader("Content-Type","application/x-www-form-urlencoded"); 
       httppost.setHeader("Authorization",headerValue); 


       // Execute HTTP Post Request 
       HttpClient httpclient = new DefaultHttpClient(); 
       HttpResponse response = httpclient.execute(httppost); // **I get the 401 error here** 
       StatusLine statusLine = response.getStatusLine(); 
       if (statusLine.getStatusCode() == HttpStatus.SC_OK) { 
       HttpEntity entity = response.getEntity(); 
       String jString= EntityUtils.toString(entity); 
       Log.d("TUMBLR - Value(s):", jString); 
       } 

      } catch (UnsupportedEncodingException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (ParseException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 
    }); 

} 

private String a64BitRandomString() { 
    StringBuffer sb = new StringBuffer(); 
    Random generator = new Random(); 

    for (int i = 0; i < 32; i++) { 
     Integer r = generator.nextInt(); 
     if (r < 0) { 
      r = r * -1; 
     } 
     r = r % 16; 

     sb.append(Integer.toHexString(r)); 
    } 

    return sb.toString(); 
} 


private String getTimeStamp(){ 
    long seconds = (long) (System.currentTimeMillis()/1000.0); 
    String secondsString = String.valueOf(seconds); 
    return secondsString; 
} 

private String getSignature(String base, String mode, String secret) { 
    String signature = null; 


    SecretKeySpec key; 
    try { 
     key = new SecretKeySpec((secret).getBytes("UTF-8"), mode); 

     Mac mac = Mac.getInstance(mode); 
     mac.init(key); 

     byte[] bytes = mac.doFinal(base.getBytes("UTF-8")); 

     signature = new String(Base64.encode(bytes,Base64.NO_WRAP)); 
    } 
    catch (UnsupportedEncodingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (NoSuchAlgorithmException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (InvalidKeyException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return signature; 
} 

Я понимаю, что это было бы очень трудно определить точную ошибку здесь. Но, я был бы рад, если бы кто-то мог дать предложения или указать мне в правильном направлении.

Строка HeaderValue имеет следующее значение:

OAuth oauth_nonce = "8d0e6e03ae2424260ddd647d5afba70d", oauth_signature_method = "HMAC-SHA1", oauth_timestamp = "1327434351943", oauth_consumer_key = "mdMFLrprZGnRw4XO736GXcXP8huxaxTT5z1nlxDK38GbyWlW38", oauth_signature = "cYNStrfA% 2F2lTaGKL8pxWHpzSq9w % 3D ", oauth_version =" 1.0 "

Таким образом, это похоже на правильный формат. Помогло бы оно включить символы новой строки в строку?

ответ

1

После разрыва моих волос на несколько дней выясняется, что я отправлял слишком много информации в тело сообщения HTTP (следовательно, на меня отбрасывалась ошибка с плохим запросом). Все, что было необходимо, это следующий набор параметров:

x_auth_username (пользователя адрес электронной почты), x_auth_password и x_auth_mode = client_auth

Кроме того, я должен сделать использование надежных функций OAuth библиотеки вместо пытаясь написать свои собственные функции, используя мои ограниченные знания. В моей защите документация никогда не была достаточно ясной. Урок очень хорошо изучен - о пересмотре кода и использовании здравого смысла. Для тех, кому может быть интересно, есть ли законный java-клиент для TUMBLR - вот ссылка github: https://github.com/nsheridan/tumblr-java. Уверяю вас, что это лучший фрагмент кода для Tumblr, с которым я столкнулся.

0

После долгих поисков, нашел следующий код где-то на твиттере -

  // replace with your username and password 
      String password = “passwd”; 
      String userName = “[email protected]”; 

      HttpPost httppost = new HttpPost("https://www.tumblr.com/oauth/access_token"); 
      CommonsHttpOAuthConsumer consumer = new CommonsHttpOAuthConsumer(
        CONSUMER_KEY, CONSUMER_SECRET);  

      List<BasicNameValuePair> reqParams = Arrays.asList(
        new BasicNameValuePair("x_auth_username", userName), 
        new BasicNameValuePair("x_auth_password", password), 
        new BasicNameValuePair("x_auth_mode", "client_auth")); 

      AuthToken authToken = null; 
      try { 
       UrlEncodedFormEntity entity = new UrlEncodedFormEntity(reqParams, HTTP.UTF_8); 
       httppost.setEntity(entity); 
       consumer.sign(httppost); 
       HttpClient httpclient = new DefaultHttpClient(); 
       HttpResponse response = httpclient.execute(httppost); 

       StatusLine statusLine = response.getStatusLine(); 
       if (statusLine.getStatusCode() == HttpStatus.SC_OK) 
       { 
        InputStream data = response.getEntity() 
          .getContent(); 

        final char[] buffer = new char[0x10000]; 
        StringBuilder out = new StringBuilder(); 
        Reader in = new InputStreamReader(data, HTTP.UTF_8); 
        int read; 
        do { 
         read = in.read(buffer, 0, buffer.length); 
         if (read > 0) 
          out.append(buffer, 0, read); 
        } while (read >= 0); 
        in.close(); 
        String responseString = out.toString(); 

        String[] splitResponse = StringUtils.split(responseString, "&"); 
        String accessTokenSecret = getParameter(splitResponse, "oauth_token_secret"); 
        String accessToken = getParameter(splitResponse, "oauth_token"); 

       } 
      } catch (UnsupportedEncodingException e) { 
      } catch (OAuthMessageSignerException e) { 
      } catch (OAuthExpectationFailedException e) { 
      } catch (OAuthCommunicationException e) { 
      } catch (Exception e) { 
      }