如何在 android 中使用 volley 实现 Digest 身份验证

Posted

技术标签:

【中文标题】如何在 android 中使用 volley 实现 Digest 身份验证【英文标题】:How to implement Digest authentication using volley in android 【发布时间】:2016-03-18 20:43:56 【问题描述】:

我在服务器端使用了 Code igniter REST api。我已经为 REST API 设置了摘要身份验证。我已经使用 volley 库在客户端(android)端发出 http 请求并使用 jsonObjectRequest 调用 URL。因此,如果有人知道如何将摘要身份验证的标头放在 volley 请求中,那么请帮助我。

【问题讨论】:

请查看***.com/questions/17049473/… @trebron 谢谢..但是给定链接中提供的解决方案对我没有帮助..您需要有关我面临的问题的任何其他详细信息吗?..以便您可以帮助我在解决这个问题... 如果您想发送自定义标头,您必须在 JsonObjectRequest 中覆盖 getHeaders()。请提供一些源代码,以便我进一步澄清。 【参考方案1】:
JSONObject paramsVolley = new JSONObject();
try 
   paramsVolley.put("u_id", 4);
 catch (JSONException e1) 
   e1.printStackTrace();

JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,      "http://admin:1234@greentin.com/apiuser/getuserdet/format/json", paramsVolley, new Response.Listener<JSONObject>() 
   @Override
   public void onResponse(JSONObject response) 
       Toast.makeText(getApplication(), response.toString(),    Toast.LENGTH_SHORT).show();
   
   @Override
   public Map<String, String> getHeaders() throws AuthFailureError 
      Map<String, String> headers = new HashMap<>();
      String credentials = "admin:1234";
      String auth = "Digest " + Base64.encodeToString(credentials.getBytes(),    Base64.NO_WRAP);
      headers.put("Content-Type", "application/json");
      headers.put("Authorization", auth);
      return headers;
   
   , new Response.ErrorListener() 
   @Override
   public void onErrorResponse(VolleyError e) 
       Toast.makeText(getApplicationContext(), "Error Occurred",Toast.LENGTH_SHORT).show();
   
);
GoGreen.getInstance().addToRequestQueue(jsonObjReq, tag_update_det);

【讨论】:

@trebron..这是我的代码..URL 是这个greentin.com/apiuser/getuserdet/format/json..i 忘记从 url 中删除 admin:1234... 你收到什么样的 VolleyError? 如果我从服务器中删除摘要认证,那么服务器会给出正确的响应 Base64 编码的用户:密码看起来像基本身份验证,而不是摘要。对于完整的摘要身份验证实现,您应该查看类似java2s.com/Open-Source/Android_Free_Code/Framework/platform/… 如果基本身份验证对您来说足够,只需将标题中的摘要更改为基本并确保您的服务器正确处理基本身份验证。 @trebron so.. 有没有其他方法可以进行 DIGEST 身份验证?【参考方案2】:

我从未检查过那些 HttpDigestStack 实现,但我可能会从这样的事情开始:

final String userName = "user";
final String password = "password";

// Instantiate the cache
Cache cache = new DiskBasedCache(getCacheDir(), 1024 * 1024); // 1MB cap

DigestAuthenticator auth = new DigestAuthenticator() 
            @Override
            protected PasswordAuthentication requestPasswordAuthentication(String rHost, InetAddress rAddr, int rPort, String rProtocol, String realm, String scheme, URL rURL, Authenticator.RequestorType reqType) 
                return new PasswordAuthentication(userName, password.toCharArray());
            
        ;

HurlStack.UrlRewriter urlRewriter = new HurlStack.UrlRewriter() 

  String rewriteUrl(String url) 
    return url;
  
;

HttpDigestStack digestStack = new HttpDigestStack(auth, urlRewriter);

// Set up the network to use HttpURLConnection as the HTTP client.
Network network = new BasicNetwork(digestStack);

// Instantiate the RequestQueue with the cache and network.
RequestQueue mRequestQueue = new RequestQueue(cache, network);

【讨论】:

以上是关于如何在 android 中使用 volley 实现 Digest 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中使用 Volley 库进行肥皂发布请求

如何在Android开发中高效使用Volley网络框架

如何在Android开发中高效使用Volley网络框架

如何使用 Gradle 替换 Android Volley 库?

Android Volley 如何使用 volley 在 POST 请求中发送用户名和密码以及其他参数

如何在 kotlin android 中使用 volley 获取 json