3

我正在开发一个能够从 Lotus Domino 数据库中读取数据的 android 应用程序。我开始创建一个页面来测试 HTTP 身份验证,我遇到了很多困难。这是我的代码片段:

    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

在浏览器中尝试相同的操作,我看到登录页面,然后是“mypage”的内容。我对我必须在 android 上遵循的正确方法和机制有点困惑。任何帮助将不胜感激!

4

3 回答 3

2

正如 Richard 在评论中提到的,您可能会看到“基于会话的身份验证表单”,使用任何类型的代码都相当麻烦。

为了获得可能任何语言都可以轻松处理的“HTTP 基本身份验证”(基于浏览器的用户名/密码提示),您可以/应该在服务器端实现覆盖会话身份验证规则

另请参阅Domino 7.0.2 允许覆盖基于会话的身份验证

于 2012-04-15T12:36:35.033 回答
1

以下是我在几个与 Lotus Domino 同步的 Android 应用程序中使用的一些代码的核心部分:

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

一些使用注意事项:

  • 这适用于基于会话的身份验证,但不适用于基本身份验证。
  • names.nsf 可能不是服务器目录的文件名,但通常是。
  • 记下端口号。通常,常规 http 为 80,https 为 443,但它们可以在 Domino 服务器上进行配置。

稍后添加...这是一个使用 Domino 进行“复制”的 Java 类的链接:DiscussionReplicator.java。查找名为getAuthenticationToken的方法,该方法返回“DominoAuthSessID=xyz”或“LtpaToken=abc”

于 2012-04-23T17:26:40.110 回答
1

如前所述,上面的代码将用于将凭据发布到 Domino 服务器,但您需要处理登录失败的任何问题 - 无论是由于身份验证还是授权。

顺便说一句,绕过 Domino 登录表单通常在客户端完成,如此处所示 - http://www.codestore.net/store.nsf/unid/BLOG-20081008 并且具有相同的问题。

在我的博客中,我谈到了在 Domino 配置数据库中的服务器上创建自定义登录表单——这是一个标准的内置配置数据库。此自定义登录表单并非设计为直接打开,而是设计用于第三方系统进行身份验证,然后它将返回带有任何身份验证/授权问题的 JSON 数据。

如果您发现在 Java 代码中更容易使用,您可以使用相同的方法并转换为 XML。

文章链接在这里:http ://www.markbarton.com/?p=314

关于 Domino 配置数据库 (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

于 2013-10-25T08:58:33.967 回答