2

読み取り許可 (またはすべての許可) を持つキー/パスを使用して Cloudant.com から情報を取得する際に問題が発生しています。このユーザーをどのように設定しても、500 エラーが発生しました。しかし、現在はすべて正常に動作していますが、誰もが読み取れるようにデータベースを開いたままにしておく必要があるため、ハッキングの危険にさらされています。そして、それが問題になる可能性があることは誰もが知っています。なぜこの問題が発生するのかについて誰かが洞察を持っているかどうか疑問に思っていました。ところで、私は Android と iOS の両方のアプリケーションで試しました。この現在の質問は、Android アプリの例を使用しています。

私のシングルトンユートピアの基準は次のとおりです。

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 変数と探している値からそれを再作成し、それをブラウザに渡す必要があることにも注意する必要があります。すべてが正常に機能しました (はい、アカウントからログオフされています)。

編集:修正、ブラウザーに貼り付けると、ログイン資格情報が要求され、キー/パスを使用すると機能します。Cloudant の開発者から、何が起こっているのかわからなかったので、この質問を StackOverflow に提出するように依頼されました (彼らは、キー/パス資格情報などを含む私のアプリ全体も持っていました)。

4

2 に答える 2

0

私の最初の考えは、リクエストで資格情報を正しく送信していない可能性があるということです。

URL 構文では、そのhttps://<username>:<password>@username.cloudant.comURL を解析し、要求に対して適切な基本認証ヘッダーを生成する HTTP ライブラリを使用する必要があります。低レベルのライブラリを使用していることを考えると、これを手動で設定する必要があると思います。

Java を使用した認証が必要なリモート URL への接続などで説明されているように、おそらく URL を使用https://username.cloudant.comして認証ヘッダーを設定する必要があります。

于 2013-08-27T09:40:19.320 に答える