2013-08-23 6 views
2

У меня возникла проблема с получением информации от Cloudant.com с использованием ключа/прохода с разрешениями на чтение (или всеми разрешениями). Я получал 500 ошибок в любом случае, я бы настроить этого пользователя. Однако в настоящее время все работает нормально, но я оставил себя открытым для взлома, так как я должен открыть свою базу для чтения всем. И все мы знаем, что это может быть проблемой. Мне было интересно, есть ли у кого-нибудь представление о том, почему эта проблема происходит. BTW, я попробовал это в приложениях для Android и iOS. В этом текущем вопросе используются примеры из приложения для Android.Разрешения для Cloudant/CouchDB на Key/Pass не работают

Вот критерии из моих одноточечной Утопия:

private static String _remote_db_protocal = "https"; 
private static String _remote_db_key = "mykey"; 
private static String _remote_db_pass = "mypass"; 
private static String _remote_db_account = "myaccount"; 
private static String _remote_db_dbname = "mydbname"; 

public static String REMOTE_JSON_DB_URL = _remote_db_protocal+"://"+ 
     _remote_db_key+":"+_remote_db_pass+"@"+ 
     _remote_db_account+".cloudant.com/"+_remote_db_dbname; 

Вот информация, которую я посылаю, чтобы получить ответ URL Строки:

private static String dbBaseURL = Utopia.REMOTE_JSON_DB_URL; 
    .... 
    String dbQueryURL = "/_design/app/_view/toys"; 
    URL finalURL; 
    try { 

     finalURL = new URL(dbBaseURL + dbQueryURL); 
     Log.i(TAG, "Getting URL: "+finalURL.toString()); 

     response = WebStuff.getURLStringResponse(finalURL); 
    .... 

И, наконец, вот мой getURLStringResponse() функция:

/* 
* Get information back from a URL 
*/ 
public static String getURLStringResponse(URL url) 
{ 
    String response = ""; 

    try { 
     URLConnection conn = url.openConnection(); 
     BufferedInputStream bin = new BufferedInputStream(conn.getInputStream()); 

     byte[] contentBytes = new byte[1024]; 
     int bytesRead = 0; 
     StringBuffer responseBuffer = new StringBuffer(); 

     while ((bytesRead = bin.read(contentBytes)) != -1) 
     { 
      response = new String(contentBytes, 0, bytesRead); 
      responseBuffer.append(response); 
     } 

     return responseBuffer.toString(); 

    } catch (Exception e) { 
     // TODO: handle exception 
     Log.e(TAG, "getURLStringResponse Error as Follows"); 
     Log.e(TAG, e.toString()); 
    } 

    return response; 
} 

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

EDIT: Исправление, когда я вставляю его в браузер, он запрашивает мои учетные данные и с помощью ключа/пароля заставляет его работать. Я попросил разработчика Cloudant задать этот вопрос в StackOverflow, потому что они были не уверены в том, что происходит (у них также было все мое приложение с учетными данными ключа/пароля и т. Д.).

ответ

3

Хорошо, я, казалось, понял это. Я пошел по нескольким путям после получения ответа Уилла вчера, но, к сожалению, большинство из них даже меня не закрыли. Некоторые из них изменили бы код ошибки от 500 до 401, но также изменили желаемое использование BufferedInputStream. Независимо от того, хотите ли вы использовать BufferedInputStream с URLConnection и включать аутентификацию для таких вещей, как Cloudant или, что бы там ни было, вам нужно использовать setRequestProperty. Теперь, с учетом сказанного, я пробовал этот маршрут несколькими разными способами и добавлял в него пользователя и пароль и делал переключатель base64 после того, как соединение было выполнено, и URL-адрес был передан в функцию, и не работал вообще. Итак, если вы можете передать ключ/пройти с URL-адресом, каким я изначально был, следующее будет отлично работать для вас ... в теории (это все-таки работало для меня).

 if (url.getUserInfo() != null) { 
      String basicAuth = "Basic " + new String(Base64.encode(url.getUserInfo().getBytes(), 0)); 
      conn.setRequestProperty("Authorization", basicAuth); 
     } 

И, конечно, здесь оно реализовано в моей функции, чтобы вы могли получить полный эффект.

public static String getURLStringResponse(URL url) 
{ 
    String response = ""; 

    try { 
     URLConnection conn = url.openConnection(); 

     // THIS WAS THE MAGIC ENTRY 
     if (url.getUserInfo() != null) { 
      String basicAuth = "Basic " + new String(Base64.encode(url.getUserInfo().getBytes(), 0)); 
      conn.setRequestProperty("Authorization", basicAuth); 
     } 
     // END OF MAGIC CHANGE 

     BufferedInputStream bin = new BufferedInputStream(conn.getInputStream()); 

     byte[] contentBytes = new byte[1024]; 
     int bytesRead = 0; 
     StringBuffer responseBuffer = new StringBuffer(); 

     while ((bytesRead = bin.read(contentBytes)) != -1) 
     { 
      response = new String(contentBytes, 0, bytesRead); 
      responseBuffer.append(response); 
     } 

     return responseBuffer.toString(); 

    } catch (Exception e) { 
     // TODO: handle exception 
     Log.e(TAG, "getURLStringResponse Error as Follows"); 
     Log.e(TAG, e.toString()); 
    } 

    return response; 
} 

Я действительно надеюсь, что это поможет некоторым из вас.

0

Моя первая мысль заключается в том, что вы, вероятно, не отправляете учетные данные правильно в своем запросе.

URL-адрес: https://<username>:<password>@username.cloudant.com Синтаксис URL-адресов требует использования библиотеки HTTP, которая будет анализировать этот URL-адрес и генерировать соответствующий заголовок базовой аутентификации для запроса. Учитывая, что вы используете низкоуровневую библиотеку, я думаю, вам нужно настроить ее вручную.

Возможно, вы захотите использовать URL-адрес https://username.cloudant.com и настроить заголовки аутентификации, как описано, например, Connecting to remote URL which requires authentication using Java.

+0

Спасибо тонну.Ты поставил меня на путь, который в конечном итоге дал мне ответ. Ура! – AlienDev

Смежные вопросы