запрос http OAuth

1

Я новичок в сетевом программировании. Я пытаюсь сделать запрос POST на основе OAuth 1.0 на Dropbox. Ниже приведен код, который я использовал для отправки запроса. Это как я должен это делать?

HttpPost httpPost;
            Log.d("HTTP","Exec");
            httpPost = new HttpPost("https://api.dropbox.com/1/shares/dropbox/a.jpg");
            Log.d("HTTP","Execute");

            try {
                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(9);
                nameValuePairs.add(new BasicNameValuePair("oauth_consumer_key", "2f2y1dyuqhp58ek"));
                nameValuePairs.add(new BasicNameValuePair("oauth_token", token));
                nameValuePairs.add(new BasicNameValuePair("oauth_nonce", String.valueOf(millis)));
                nameValuePairs.add(new BasicNameValuePair("oauth_timestamp", String.valueOf(millis)));
                nameValuePairs.add(new BasicNameValuePair("oauth_signature_method", "HMAC-SHA1"));
                nameValuePairs.add(new BasicNameValuePair("oauth_version", "1.0"));
                nameValuePairs.add(new BasicNameValuePair("oauth_signature", sw));//this is url encoded
                //nameValuePairs.add(new BasicNameValuePair("path", "/a.jpg"));
                //nameValuePairs.add(new BasicNameValuePair("root", "dropbox"));
                httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

                Log.d("HTTP","requesting");
                HttpResponse response = httpclient.execute(httpPost);

                HttpEntity entity = response.getEntity();
                InputStream is = entity.getContent();
            String result;
                BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                 StringBuilder sb = new StringBuilder();
                 String line = null;
                 line = reader.readLine();
                 sb.append(line); 
                 result = sb.toString();
                 is.close();

                //String s=response.getEntity().getContent().;
                Log.d("resp", result);
                //tv.setText(response.toString());

            } catch (ClientProtocolException e) {
            } catch (IOException e) {
            }

Базовая строка подписи:

POST&https%3A%2F%2Fapi.dropbox.com%2F1%2Fshares%2Fdropbox%2Fa.jpg&oauth_consumer_key%3D2f2y1dyuqhp58ek%26oauth_nonce%3D1340729641%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1340729641%26oauth_token%3Dwz27t6thob0fbxl%26oauth_version%3D1.0

T Любой вопрос, что может быть проблемой? Ответ, который я получаю, - это недопустимая подпись Base string, которая отображается в logCat.

LogCat:

06-26 22:30:46.125: I/System.out(364): debugger has settled (1322)
06-26 22:30:49.203: I/ActivityManager(66): Displayed activity cloud.mobile/.MCActivity: 9393 ms (total 9393 ms)
06-26 22:30:49.243: W/ActivityManager(66): Launch timeout has expired, giving up wake lock!
06-26 22:30:57.124: D/HTTP(364): wz27t6thob0fbxl
06-26 22:30:59.197: D/HTTP(364): Exe
06-26 22:30:59.886: D/HTTP(364): 1340730059
06-26 22:31:00.824: D/HTTP(364): POST&https%3A%2F%2Fapi.dropbox.com%2F1%2Fshares%2Fdropbox%2Fa.jpg&oauth_consumer_key%3D2f2y1dyuqhp58ek%26oauth_nonce%3D1340730059%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1340730059%26oauth_token%3Dwz27t6thob0fbxl%26oauth_version%3D1.0
06-26 22:31:00.824: D/HTTP(364): xLNJrQ5R9jxDTnZcpQ3HLkLBxxQ=
06-26 22:31:00.973: D/HTTP(364): Exe
06-26 22:31:00.983: D/HTTP(364): Exec
06-26 22:31:01.023: D/HTTP(364): Execute
06-26 22:31:01.664: D/HTTP(364): requesting
06-26 22:31:12.243: D/dalvikvm(364): GC_FOR_MALLOC freed 5195 objects / 296968 bytes in 185ms
06-26 22:31:25.063: I/global(364): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
06-26 22:31:28.545: D/resp(364): {"error": "Invalid signature. Expected signature base string: POST&https%3A%2F%2Fapi.dropbox.com%2F1%2Fshares%2Fdropbox%2Fa.jpg&oauth_consumer_key%3D2f2y1dyuqhp58ek%26oauth_nonce%3D1340730059%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1340730059%26oauth_token%3Dwz27t6thob0fbxl%26oauth_version%3D1.0"}

Ну, эта "ожидаемая базовая строка подписи (показанная выше)" точно такая же, как и я, сгенерированный и преобразованный в oauth_signature с использованием HMAC-SHAH.. Я что-то пропустил?

Теги:
post
http
oauth

1 ответ

2

Возможно, что-то не так, как вы вычисляете свое значение для oauth_signature. Поскольку вы не предоставили код для этого, я попытаюсь сделать снимок в темноте:

Как кто-то на форуме Dropbox уже указал, сказав

Получение правильной составляющей сигнатуры OAuth всегда является огромной болью. Вы должны стараться сделать так, чтобы базовая строка, созданная вашей библиотекой, была похожа на ту, которую ожидает сервер. Как только это правда, единственный способ, которым вы можете испортить, - это hmac с неправильным ключом.

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

Спецификация OAuth описывает три разных метода для подписи базовой строки. При использовании HMAC-SHA1 вы должны вызывать этот метод с базовой строкой и конкатенированными значениями в качестве входных параметров. Вы можете найти пример реализации для использования этого метода в Java здесь.

Поскольку Dropbox использует только API SSL, вы также можете вернуться к использованию метода PLAINTEXT и напрямую передать базовую строку.

Кроме того, вы используете один и тот же ввод метки времени для oauth_timestamp и oauth_nonce который не рекомендуется, oauth_nonce всегда должен быть уникальным. Для более подробного объяснения проблемы и использования глобального счетчика для ее решения прочитайте эту статью.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню