Tumblr Xauth Android - 400 Ошибка неверного запроса - PullRequest
1 голос
/ 25 января 2012

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

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

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;
}

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

String 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"

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

Ответы [ 2 ]

1 голос
/ 26 января 2012

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

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

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

0 голосов
/ 02 января 2014

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

            // replace with your username and password
            String password = “passwd”;
            String userName = “test@test.com”;

            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) {
            }               
...