2014-03-19 2 views
0

wink-client v1.4를 사용하여 Sharepoint RESTful 웹 서비스와 통신하려고합니다. BasicAuthSecurityHandler를 사용하여 Windows에서이 작업을 수행 할 수있는 간단한 Java SE Maven 프로젝트를 만들었습니다. 그러나이 프로젝트는 Mac OS X에서 작동하지 않습니다. Mac에서 401 HTTP 상태 코드가 수신됩니다. 윙크는 Windows에서 실행할 때 어떻게 든 내 NTLM 자격 증명을 사용합니다. 두 플랫폼 모두에서 JDK 7을 사용하고 있습니다.Apache Wink 클라이언트에서 NTLM 인증을 사용하는 방법

Apache Wink 클라이언트에서 NTLM 인증을 사용하려면 어떻게해야합니까?

public String getSharepointInfo() { 
    spUser = "user"; 
    spPassword = "password"; 
    spUri = "https://someSharepointURL/"; 

    ClientConfig clientConfig = new ClientConfig(); 

    Application app = new Application() { 
     public Set<Class<?>> getClasses() { 
      Set<Class<?>> classes = new HashSet<Class<?>>(); 
      classes.add(WinkMOXyJsonProvider.class); 
      return classes; 
     } 
    }; 
    clientConfig.applications(app); 
    BasicAuthSecurityHandler basicAuthSecurityHandler = new BasicAuthSecurityHandler(); 
    basicAuthSecurityHandler.setUserName(spUser); 
    basicAuthSecurityHandler.setPassword(spPassword); 
    clientConfig.handlers(basicAuthSecurityHandler); 
    RestClient client = new RestClient(clientConfig); 
    Resource resource = client.resource(spUri); 

    ClientResponse response = resource.accept("*/*").get(); 

    String blah = response.getEntity(String.class); 
    System.out.println("The response is " + blah); 
    return blah.toString(); 
} 
+0

OS X에서 Apache HttpClient v4.0.1을 사용하여 NTLM 인증을 사용하기 위해 GET 요청을 받았습니다.이 링크를 따라갔습니다 : http://zhangyelei.blogspot.com/2014/03/httpclient-version-conflict -on-was.html. 이는 HttpClient 버전이 WAS v8.0 및 v8.5에서 사용되므로 중요한 첫 번째 단계입니다. 이 버전을 덮어 쓰려면 격리 공유 라이브러리와 같이 어리석은 조치를 취해야합니다. 그것은 나의 경우와 마찬가지로 일부에게는 실현 불가능할 수도 있습니다. 이제 Apache HttpClient v4.0.1을 Apache Wink와 함께 사용하는 방법을 알아야합니다. –

답변

0

알아 냈습니다.

궁극적 인 목표는 WebSphere Application Server v8.0으로 포팅 할 수있는 간단한 테스트 케이스를 만드는 것이 었습니다. Apache Wink 클라이언트는 자체적으로 NTLM 인증을 처리 할 수 ​​없습니다. NTLM 인증을 처리하려면 별도의 Http 클라이언트를 사용해야합니다. 그 버기 버전은 WAS v8.0에 패키지되어 있기 때문에 나는 Apache Http Cient v4.0.1을 선택했다. 제공된 버전을 무시하는 것은 큰 고통입니다. 이것이 내가 더 최근의 Apache HttpClient 버전을 선택하지 않은 이유입니다. 다음 종속성을 사용하여 ... 내가 com.ibm.ws.prereq.jaxrs을 사용하고

<dependency> 
     <groupId>jcifs</groupId> 
     <artifactId>jcifs</artifactId> 
     <version>1.3.17</version> 
     <type>jar</type> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.wink</groupId> 
     <artifactId>wink-client</artifactId> 
     <version>1.4</version> 
    </dependency> 

: 아파치 HTTP 클라이언트 v4.0.1는 NTLM 인증을 처리하기 위해 얼마나

그래서, 여기. jar는 Apache Http Client v4.0.1을 얻기 위해 WAS v8.0에 포함되어 있습니다. 그건 내 Maven repo에 설치되어 있고, 나는 Http Client v4.0.1을 얻는 의존성으로 지정했다.

here 단계를 따르십시오.

이제, 윙크는 활동하기 시작 : 이제

public int attemptWinkHttpClienGET() { 
    ClientResponse response = null; 
    try { 
     String spUri = "https://some-sharepoint-url/listdata.svc/"; 

     StringBuilder sb = new StringBuilder(); 
     sb.append(spUri).append("UserInformationList").toString(); 

     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     httpClient.getAuthSchemes().register("ntlm",new JCIFSNTLMSchemeFactory()); 
     CredentialsProvider credsProvider = new BasicCredentialsProvider(); 
     NTCredentials ntcred = new NTCredentials("username_here", "password_here", InetAddress.getLocalHost().getHostName(), "domain_here"); 
     credsProvider.setCredentials(new AuthScope("base_url_here_sans_https://", 443, AuthScope.ANY_REALM, "NTLM"), ntcred); 
     httpClient.setCredentialsProvider(credsProvider); 

     org.apache.wink.client.ClientConfig httpClientConfig = new org.apache.wink.client.ApacheHttpClientConfig(httpClient); 
     Application app = new Application() { 
      public Set<Class<?>> getClasses() { 
       Set<Class<?>> classes = new HashSet<Class<?>>(); 
       classes.add(WinkMOXyJsonProvider.class); 
       return classes; 
      } 
     }; 
     httpClientConfig.applications(app); 
     RestClient client = new RestClient(httpClientConfig); 
     Resource resource = client.resource(sb.toString()); 
     response = resource.accept(MediaType.APPLICATION_JSON_TYPE).get(); 
     UserInformationListResponse blah = response.getEntity(UserInformationListResponse.class); 
     Results[] results = blah.getD().getResults(); 
     for (Results result : results) { 
      System.out.println("User Name: " + result.getFirstName() + " " + result.getLastName()); 
     } 
     System.out.println("The response is " + response.getStatusCode()); 
     response.consumeContent(); 
    } catch (UnknownHostException ex) { 
     Logger.getLogger(HttpTest.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    return response.getStatusCode(); 
} 

, 최종 비트. MOXy를 JAXB 구현으로 사용한다. 내 애플 리케이션 변수에 등록 했는데도 문제가있다. 잭슨과 관련된 몇 가지 오류가 발생했습니다. Apache HttpClient v4.0.1은 분명히 후드 아래의 Jackons를 기본값으로 사용하고 있습니다. 그 문제를 극복하기 위해 내가 한 일이 바로 여기에 있습니다.

나는 다음과 같은 종속성을 추가 :
<dependency> 
     <groupId>org.glassfish.jersey.media</groupId> 
     <artifactId>jersey-media-moxy</artifactId> 
     <version>2.0</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-annotations</artifactId> 
     <version>2.4.0-rc2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-jaxrs</artifactId> 
     <version>1.9.13</version> 
    </dependency> 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-xc</artifactId> 
     <version>1.9.13</version> 
    </dependency> 

여기 WinkMOXyJsonProvider.java

import javax.ws.rs.Consumes; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.ext.Provider; 
import org.eclipse.persistence.jaxb.rs.MOXyJsonProvider; 

@Provider 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public class WinkMOXyJsonProvider extends MOXyJsonProvider { 

} 

의 난 결과는 문자열 셰어에서 반환 된 다음 목시 POJO의이 JSON 객체 계층 구조를 모방 한 무리를 만들어 관찰했다.