LoginSignup
3
2

More than 5 years have passed since last update.

VolleyでDigest認証やってみた

Last updated at Posted at 2013-06-20

HTTPライブラリVolleyでDigest認証を実装してみたという話。誰得感は否めない。

基本的な流れ

  1. リクエストキューにリクエストを追加する。リクエスト(Request<T>を継承したやつ)にはリトライポリシー(RetryPolicyを継承したやつ)を仕込んでおく(Request<T>#setRetryPolicy())。
  2. 401が返ってくる。この時、RetryPolicy#retry()が呼ばれるので、そこで401と一緒に受け取るWWW-AuthenticateヘッダのパラメータをDigestScheme#processChallenge()に渡す
  3. ユーザ名とPWをDigestScheme#authenticate()に渡してAuthorizationヘッダを作る。
  4. オーバライドしたRequest<T>#getHeaders()の中でAuthorizationヘッダを追加する。

Digest認証やVolley内部の処理の流れなど細かいことはブログに書きました。

2から4までをやるのが下記のコードです。

MyRequest.java
public class MyRequest extends Request<JSONObject> {

// いろいろ略
// コンストラクタとかでDigestRetryPolicyを生成する

   @Override
   public Map<String, String> getHeaders() throws AuthFailureError {
      DigestScheme ds = new DigestScheme();
      ds.processChallenge(new BasicHeader("WWW-Authenticate",
                     mChallengeHeader.get("WWW-Authenticate"));
      Header header = ds.authenticate(credencials, request);

      Map<String, String> newHeader
                 = new HashMap<String, String>(super.getHeaders());
      newHeader.put(header.getName(), header.getValue());
      return newHeader;
   }

   private Map<String, String> mChallengeHeader;

   public void setChallengeHeader(Map<String, String> header) {
      this.mChallengeHeader = header;
   }

   class DigestRetryPolicy extends DefaultRetryPolicy {
      @Override
      public void retry(VolleyError error) throws VolleyError {
         if (error.statusCode == HttpStatus.SC_UNAUTHORIZED) {
            setChallengeHeader(error.networkResponse.header);
         } else {
            super.retry(error);
         }
      }
   }

}
3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2