【问题标题】:How create NTLM Authentification with Retrofit如何使用 Retrofit 创建 NTLM 身份验证
【发布时间】:2016-02-25 06:57:38
【问题描述】:

由于 23 sdk Android 类被排除在外:

org.apache.http.auth.AuthScheme;
org.apache.http.auth.AuthSchemeFactory;
org.apache.http.impl.auth.NTLMScheme;
org.apache.http.impl.auth.NTLMEngine;
org.apache.http.impl.auth.NTLMEngineException;

因为它现在在 AD 中授权,通过改造使用登录名和密码?还有OKHttpkclient可以通过headers吗?

【问题讨论】:

    标签: java android retrofit ntlm


    【解决方案1】:

    1) 将包 org.apache.httpcomponents:httpclient:4.5 添加到 build.gradle (app)

    //noinspection DuplicatePlatformClasses
    implementation '**org.apache.httpcomponents:httpclient:4.5**'
    

    2) 将包 org.apache.http.impl.auth 添加到您的项目(/java 中的文件夹)

    3) 在添加的 org.apache.http.impl.auth 包中创建公共类

    public class PublicNTLMEngineImpl implements NTLMEngine {
      // with content of http://svn.apache.org/repos/asf/httpcomponents/httpclient/tags/4.5.2/httpclient/src/main/java/org/apache/http/impl/auth/NTLMEngineImpl.java
    }
    

    4) 将 Giohji 的 NTLMAuthenticator 与新的 PublicNTLMEngineImpl

    实例一起使用
    OkHttpClient httpClient = new OkHttpClient.Builder()
                    .connectTimeout(30, TimeUnit.SECONDS)
                    .writeTimeout(10, TimeUnit.SECONDS)
                    .readTimeout(30, TimeUnit.SECONDS)
                    .authenticator(new NTLMAuthenticator(username, password, domainOrComputerName))
                    .build();
    

    5) 源代码: http://svn.apache.org/repos/asf/httpcomponents/httpclient/tags/4.5.2/httpclient/src/main/java/org/apache/http/impl/auth/

    【讨论】:

      【解决方案2】:

      我在okhttp's github 上找到了答案。 由SelvinPL发布。

      首先您必须实现 NTLM 身份验证器(它使用 NTLMEngineImpl,org.apache.http.impl.auth.NTLMEngineImpl 的独立版本,也是由SelvinPL 创建的)。下面的代码是SelvinPL 实现的略微修改版本,可在最新的改造版本 (2.1.0) 上运行。

      private static class NTLMAuthenticator implements Authenticator {
          final NTLMEngineImpl engine = new NTLMEngineImpl();
          private final String domain;
          private final String username;
          private final String password;
          private final String ntlmMsg1;
      
          private NTLMAuthenticator(String username, String password, String domain) {
              this.domain = domain;
              this.username = username;
              this.password = password;
              String localNtlmMsg1 = null;
              try {
                  localNtlmMsg1 = engine.generateType1Msg(null, null);
              } catch (Exception e) {
                  e.printStackTrace();
              }
              ntlmMsg1 = localNtlmMsg1;
          }
      
          @Override
          public Request authenticate(Route route, Response response) throws IOException {
              final List<String> WWWAuthenticate = response.headers().values("WWW-Authenticate");
              if (WWWAuthenticate.contains("NTLM")) {
                  return response.request().newBuilder().header("Authorization", "NTLM " + ntlmMsg1).build();
              }
              String ntlmMsg3 = null;
              try {
                  ntlmMsg3 = engine.generateType3Msg(username, password, domain, "android-device", WWWAuthenticate.get(0).substring(5));
              } catch (Exception e) {
                  e.printStackTrace();
              }
              return response.request().newBuilder().header("Authorization", "NTLM " + ntlmMsg3).build();
          }
      }
      

      然后你可以像这个例子一样注册验证器:

      OkHttpClient client = new OkHttpClient.Builder()
                  .authenticator(new NTLMAuthenticator(username, password, domain))
                  .build();
      Retrofit retrofit = new Retrofit.Builder()
                  .baseUrl(getURL(context))
                  .addConverterFactory(GsonConverterFactory.create())
                  .client(client)
                  .build();
      return retrofit.create(Api.class);
      

      适用于 com.squareup.retrofit2:retrofit:2.1.0。

      【讨论】:

      • NTLMEngineImpl - 在 23 sdk 中不支持
      • 生成type1Msg时为什么要在域中传递null?
      • 什么是 NTLMEngineImpl 以及从哪里获得 gradle 依赖项??
      猜你喜欢
      • 2017-11-29
      • 2021-12-22
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多