2013-12-16 12 views
11

私はいくつかのレガシーコードで作業しようとしています。android-volley error認証のチャレンジが見つかりません

私のメインサイトが持っているapiにアクセスしようとしていますが、1つのアカウントでうまく動作しますが、別のアカウントではうまく動作しません。リクエストURL /ヘッダーの違いや返信の内容を確認しようとしていますが、これをログに出力する方法を見つけることができません。私はこれが原因401応答にあるかもしれないことを周りに読んだが、私は本当にそれが何を意味するのか知りませんか、少なくともどのように証明するために

com.android.volley.NoConnectionError: java.io.IOException: No authentication challenges found 

私は取得していますエラーです/それをテストする。私は本当にそれが1つのアカウントで動作し、別のアカウントでは動作しないと混乱しています。

URLは私たちの英国のサイトとAMとは少し異なりますが、それ以外は違いはありません。

おかげ

+0

Volleyリクエストを実行するときに接続が確立されなかったことを示すエラーです。 – Raghunandan

+0

@Raghunandanそれ以上の情報を得る方法があるのか​​どうか分かりますか?応答の詳細など? –

+0

接続が確立できませんでした。応答が得られるチャンスがどこになければ – Raghunandan

答えて

8

サーバは401(無許可)を送信しますが、次に何をすべきかのクライアントのためのヒントである「WWW認証」を与えるものではありませんので、このエラーが発生しました。 「WWW-Authenticate」ヘッダーは、クライアントにどの種類の認証が必要かを指示します(BasicまたはDigestのいずれか)。これは通常、ヘッドレスhttpクライアントではあまり役に立ちませんが、標準がどのように定義されているかです。このエラーは、libが "WWW-Authenticate"ヘッダーを解析しようとしたができないために発生します。サーバーを変更することができるかどう

考えられる解決策:WWW-Authenticate: Basic realm="fake"

  • は次のように偽の「WWW認証」ヘッダーを追加します。これは解決策ではなく単に回避策に過ぎませんが、うまくいくはずですし、httpクライアントも満足しているはずです。
  • 401の代わりに403というHTTPステータスコードを使用します。セマンティックは同じではなく、通常はログイン401で作業するときは正しい応答(see here for a detailed discussion)ですが、十分に近いです。サーバーを変更することができない場合

考えられる解決策:

@ErikZはあなたが使用することができ、彼postに書いたように&キャッチ

HttpURLConnection connection = ...; 
try { 
    // Will throw IOException if server responds with 401. 
    connection.getResponseCode(); 
} catch (IOException e) { 
    // Will return 401, because now connection has the correct internal state. 
    int responsecode = connection.getResponseCode(); 
} 

を試してみてください、私もここの投稿:java.io.IOException : No authentication challenges found

+0

私はヘッダーを送信しようとしていますダイジェスト認証ですが、それを行う方法はわかりません(まだ回答を探しています)。 Android-Volleyでダイジェスト認証(または基本認証)を行う方法に関するサンプルはありますか? –

+0

BasicとDigestはちょうどこのようなヘッダーを入れています。 "Authorization:Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ ==" Basicでは、ダイジェストではもっと複雑です - これはバレーにとって特別なことではなく、単にヘッダーセットを置くだけです) – for3st

+0

申し訳ありませんが、私はこの質問をずっと前に尋ねました。私はそれが何に関連しているのか、そしてそのレガシープロジェクトが閉鎖されていることも覚えていません。私はあなたが入れている努力のためにあなたの答えをupvoteしますが、それは私が恐れている答えとしてそれを選択しませんので、それが正しいのチェックの方法がありません。 –

8

実際、この問題はサーバの応答にWWW-Authenticateヘッダーを含めることで解決しました。

ただし、ヘッダWWW-Authenticate: Basic realm=""を追加してもAPIがWebクライアントによって消費されると、一部のWebブラウザが基本認証情報を要求するポップアップを表示します。

私の場合、適切なソリューションはカスタムスキームを使用しています。このblog postで説明したように、私はBasicの代わりにxBasicをヘッダレスポンスに使用します。このヘッダで

WWW-Authenticate: xBasic realm=""

、バレーボールは正しく応答を解析しますが、私はまた、認証ポップアップを示すWebブラウザを避けるだけでなく。

+0

私はすみません。私はそれが何に関連しているのか、そしてそのレガシープロジェクトが閉鎖されていることを覚えていないので、ずっと前にこの質問をしました。私はあなたが入れている努力のためにあなたの答えをupvoteしますが、それは私が恐れている答えとしてそれを選択しませんので、それが正しいのチェックの方法がありません。 –

+0

@Russ問題ありません!ちょうど答えを探している他の人を助けたいと思っています:) –

+0

これに付随するちょっとしたメモ。上記スキームには任意の文字列(例えば 'xBasic'など)を使用できますが、例外がスローされるのを避けるために' realm = ""(引用符も含む)を含める必要があります。 –

0

私はボレーREQUESTQUEUE初期化するとき、このクライアント側をキャッチすることができました:

Volley.newRequestQueue(getApplicationContext(), new HurlStack() { 
     @Override 
     public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders) { 
      try { 
       return super.performRequest(request, additionalHeaders); 
      } catch (AuthFailureError authFailureError) { 
       authFailureError.printStackTrace(); 
       // Log out/whatever you need to do here 
      } catch (IOException e) { 
       e.printStackTrace(); 
       if (e.getMessage().equals("No authentication challenges found")) { 
        // This is the error. You probably will want to handle any IOException, not just those with the same message. 
       } 
      } 
      return null; 
     } 
}); 
0

をサーバーがクラッシュした場合、あなたはこの問題に直面する可能性があります。 手順:

  1. Tomcatサーバーを停止します

  2. 後藤ファイル名を指定して実行 - >サービス - >データベース再起動します(例:postgresの)

  3. スタートTomcatサーバーを。

0

eはinstanceof AuthFailureErrorであることを確認できます。

Log.e(TAG, "AuthFailureError: " + (e instanceof AuthFailureError)); 
関連する問題