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

リチャードがコメントで述べたように、あなたはおそらく「セッションベースの認証フォーム」を見ているでしょう。これはどんな種類のコードでも回避するのがかなり面倒です。

おそらくどの言語でも簡単に処理できる「HTTP基本認証」(ブラウザベースのユーザー名/パスワードプロンプト)を取得するには、サーバー側でセッション認証ルールの上書きを実装できます/実装する必要があります。

関連項目Domino7.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。「DominoAuthSessID=xyz」または「LtpaToken=abc」を返すgetAuthenticationTokenというメソッドを探します。

于 2012-04-23T17:26:40.110 に答える