2012-04-13 4 views
3

Я разрабатываю приложение для Android, способное считывать данные из базы данных Lotus Domino. Я начал создавать страницу для проверки подлинности HTTP, и я столкнулся с множеством трудностей. Это мой фрагмент кода:Антенна HTTP-аутентификация на сервере Lotus Domino

public void GoAuth(View v){ 
    final String httpsURL = "http://xxx.xxx.xxx.xxx/names.nsf/mypage?openpage"; 
    final DefaultHttpClient client = new DefaultHttpClient(); 
    final HttpPost httppost = new HttpPost(httpsURL); 

    String userName = "demo"; 
    String password = "demo"; 

    try { 
     //authentication block: 
     final List<BasicNameValuePair> nvps = new ArrayList<BasicNameValuePair>(); 
     nvps.add(new BasicNameValuePair("Username", userName)); 
     nvps.add(new BasicNameValuePair("Password", password)); 
     final UrlEncodedFormEntity p_entity = new UrlEncodedFormEntity(nvps, HTTP.UTF_8); 
     httppost.setEntity(p_entity); 

     //sending the request and retrieving the response: 
     HttpResponse response = client.execute(httppost); 
     HttpEntity responseEntity = response.getEntity(); 

     if (response.getStatusLine().getStatusCode() == HttpURLConnection.HTTP_OK){ 
      //handling the response 
      final InputSource inputSource = new InputSource(responseEntity.getContent()); 
      TextView res=(TextView)findViewById(R.id.result); 
      res.setText("Server response: "+inputSource.toString()); 
     } 

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


} 

Ответ сервера: org.xml.sax InputSource @ 40575700

Попытка же самое в браузере, я вижу на страницу входа и после, то содержание " моя страница". Я немного смущен правильным подходом и механизмом, которым я должен следовать на Android. Любая помощь будет принята с благодарностью!

+0

Что вы ожидаете ответа быть? HTML? Создание «InputSource» достигает * ничего *, за исключением подготовки содержимого, полученного от сервера, для анализа, например, анализатора SAX. Вы просто хотите сбросить серверный ответ - в этом случае вам следует просто использовать [EntityUtils # toString (responseEntity)] (http://developer.android.com/reference/org/apache/http/util/EntityUtils.html) , – Jens

+0

Вы видите страницу входа или видите диалоговое окно входа? Если вы видите полную страницу, то сервер Domino настроен на использование аутентификации на основе сеанса (на основе файлов cookie) вместо базовой проверки подлинности. –

+0

@rhsatrhs Я вижу страницу входа в систему, сервер настроен на использование аутентификации сеанса – Vincent

ответ

2

Как упоминал Ричард в комментариях, вы, вероятно, видите форму «session based authentication», которая довольно громоздка для работы с любым кодом.

Чтобы получить «базовую аутентификацию HTTP», с которой, возможно, любой язык может легко справиться (подсказка о имени пользователя/пароле на основе браузера), вы можете/должны реализовать Override Session Authentication Rule на стороне сервера.

Смотрите также Domino 7.0.2 allows for overriding of session-based authentication

1

Вот центральная часть некоторого кода я использую в паре Android приложений, которые синхронизировать с Lotus Domino:

private boolean authenticateWithDomino() throws Exception { 

    String fullLoginUrl = ""; 

    if (useSSL) { 
     fullLoginUrl = "https://" + hostName + ":" + httpPort + "/names.nsf?Login"; 
    } else { 
     fullLoginUrl = "http://" + hostName + ":" + httpPort + "/names.nsf?Login"; 
    } 

    DominoHttpRequest dominoRequest = DominoHttpClient.getInstance() 
      .createRequest(); 
    dominoRequest.setUrl(fullLoginUrl); 
    dominoRequest.setMethod("POST"); 
    dominoRequest.addParam("username", notesName); 
    dominoRequest.addParam("password", notesPassword); 
    dominoRequest.addParam("redirectto", "/icons/ecblank.gif"); 
    dominoRequest.execute(); 
    } 

Некоторые заметки о Useage:

  • Это работает с аутентификацией на основе сеанса, но не с обычной аутентификацией.
  • names.nsf может не быть именем файла каталога сервера, но обычно это так.
  • Обратите внимание на номер порта. Обычно это 80 для обычных http и 443 для https, но они настраиваются на сервере Domino.

Добавлено позже ... Вот ссылка на Java-класс, который выполняет «репликацию» с помощью Domino: DiscussionReplicator.java. Посмотрите на метод, называемый getAuthenticationToken, который возвращает либо «DominoAuthSessID = хуг» или «LtpaToken = абв»

+0

Спасибо большое Jens, я не понимаю два класса DominoHttpRequest и DominoHttpClient. Какие-нибудь подробности об этом? (Являются ли они обычными классами? Должен ли я использовать стандартный org.apache.http.HttpRequest?) – Vincent

+0

Да, DominoHttpRequest и DominoHttpClient - мои пользовательские классы. Я не могу сделать весь код доступным в Интернете. Я использую org.apache.http.impl.client.DefaultHttpClient. – Jbruntt

+0

Отлично! Благодаря вашим предложениям я сделал это! Я использовал http basic authentication, и я думал о безопасности; используя ** https ** достаточно, чтобы быть «тихим» против сниффера трафика? – Vincent

0

Как упомянуто выше код будет работать для размещения учетных данных к Domino Server, но вам нужно будет обрабатывать любые проблемы с ошибкой входа в систему - будь то из-за аутентификации или авторизации.

BTW В обход формы входа в Domino часто делается клиентская сторона, как показано здесь - http://www.codestore.net/store.nsf/unid/BLOG-20081008 и имеет те же проблемы.

В моем блоге я расскажу о создании пользовательской формы входа на сервере в базе данных конфигурации Domino - это стандартная и встроенная база данных конфигурации. Эта пользовательская форма входа не предназначена для прямого открытия, а предназначена для сторонних систем для аутентификации, затем она будет возвращать данные JSON с любыми проблемами аутентификации/авторизации.

Вы можете использовать тот же подход и преобразовать его в XML, если вам будет проще использовать его в Java-коде.

Ссылка на статью здесь: http://www.markbarton.com/?p=314

Ссылка на информацию о БД Domino Configuration (domconfig.nsf) здесь http://publib.boulder.ibm.com/infocenter/domhelp/v8r0/index.jsp?topic=%2Fcom.ibm.help.domino.admin.doc%2FDOC%2FH_CREATING_THE_DOMINO_CONFIGURATION_DATABASE.html

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