web-dev-qa-db-ja.com

JAXWSクライアントは認証できません

標準のJava 7 JAX WSツールを使用して安全な(HTTPSスキーマ)Webサービスを利用しようとしています。このWebサービスには認証が必要です。

ローカルJavaキーストアに証明書を正常に追加しました。wsimportツールを使用してWSDLファイルから生成した必要なすべてのクラス。

今、私は簡単なテストを実行するために次の呼び出しを使用しようとしています:

public class ReportingWebServiceTest {
    static ReportingServiceService service;
    static ReportingService port;

    @BeforeClass
    public static void setUpBeforeClass(){
        service = new ReportingServiceService();
        port = service.getReportingServicePort();
        Map<String, Object> rContext = ((BindingProvider) port).getRequestContext();
        Map<String, List<String>> headers = new HashMap<String, List<String>>();
        headers.put("Authorization", Collections.singletonList("Basic YWRtaW5AYWRhcHRsb2dpYy5jb206MTIxMjE****="));

//      headers.put("Username", Collections.singletonList("*****@******.com"));
//      headers.put("Password", Collections.singletonList("********"));
        rContext.put(MessageContext.HTTP_REQUEST_HEADERS, headers);
//      rContext.put(BindingProvider.USERNAME_PROPERTY, "*****@******.com");
//      rContext.put(BindingProvider.PASSWORD_PROPERTY, "********");
    }   

    @Test
    public void test() {
        WEBCAMPAIGNROW row = port.getCampaignRowById(14081);
        toConsole(row.toString());
    }

    protected static void toConsole(String msg) {
        System.out.println(msg);
    }
}

テストを実行すると、次の例外が発生します。

javax.xml.ws.WebServiceException: Failed to access the WSDL at: https://reporting-stage.admp.mtv3.adtlgc.com/admp/ReportingService?wsdl. It failed with: 
    Got Server returned HTTP response code: 401 for URL: https://reporting-stage.admp.mtv3.adtlgc.com/admp/ReportingService?wsdl while opening stream from https://reporting-stage.admp.mtv3.adtlgc.com/admp/ReportingService?wsdl.
    at com.Sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.tryWithMex(RuntimeWSDLParser.Java:173)
    at com.Sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.Java:155)
    at com.Sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.Java:120)
    at com.Sun.xml.internal.ws.client.WSServiceDelegate.parseWSDL(WSServiceDelegate.Java:257)
    at com.Sun.xml.internal.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.Java:220)
    at com.Sun.xml.internal.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.Java:168)
    at com.Sun.xml.internal.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.Java:96)
    at javax.xml.ws.Service.<init>(Service.Java:77)
    at com.enreach.admp.reporting.ReportingServiceService.<init>(ReportingServiceService.Java:42)
    at me.enreach.automation.mtv3.ReportingWebServiceTest.setUpBeforeClass(ReportingWebServiceTest.Java:26)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:606)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.Java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.Java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.Java:44)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.Java:24)
    at org.junit.runners.ParentRunner.run(ParentRunner.Java:309)
    at org.Eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.Java:50)
    at org.Eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.Java:38)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:467)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:683)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.Java:390)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.Java:197)
Caused by: Java.io.IOException: Got Server returned HTTP response code: 401 for URL: https://reporting-stage.admp.mtv3.adtlgc.com/admp/ReportingService?wsdl while opening stream from https://reporting-stage.admp.mtv3.adtlgc.com/admp/ReportingService?wsdl
    at com.Sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.createReader(RuntimeWSDLParser.Java:842)
    at com.Sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.resolveWSDL(RuntimeWSDLParser.Java:283)
    at com.Sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.Java:140)
    ... 23 more
Caused by: Java.io.IOException: Server returned HTTP response code: 401 for URL: https://reporting-stage.admp.mtv3.adtlgc.com/admp/ReportingService?wsdl
    at Sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.Java:1626)
    at Sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.Java:254)
    at Java.net.URL.openStream(URL.Java:1037)
    at com.Sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.createReader(RuntimeWSDLParser.Java:827)
    ... 25 more

ご覧のとおり、私は3つの異なる認証手法を適用しようとしましたが、うまくいきませんでした。例外は3つのケースすべてで同じです。私は何が間違っているのですか?

P.S.ブラウザでWSDLにアクセスしようとすると、コードで使用する資格情報は正常に機能します。

10

いくつか試してみましょう:

1.)サーバーが期待する認証の種類を知っていますか?

2.)アクセスしようとすると https://reporting-stage.admp.mtv3.adtlgc.com/admp/ReportingService?wsdl 何か表示されますか?例えばIPホワイトリストなどがあると思いますが、そこに資格情報などを入力しますか?何も見えないから。

3.)コードに関しては、次の方法でHTTP経由でセキュリティで保護されたWebサービスに対して認証します。

ReportingServiceService service new ReportingServiceService();
ReportingService port = service.getReportingServicePort();
BindingProvider binding = (BindingProvider) port;

// Configure service endpoint (override defined one of the WSDL) 
BindingProvider binding = (BindingProvider) port;
binding.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "https..");


// Add HTTP Basic Authentification credentials to this request      
binding.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "myuser");   
binding.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "mypasswd");
port.getCampaignRowById(14081);

上記のエンドポイントプロパティを、wsdlのwsdl:port ...に保存されているものに設定します。これは、次のようになります(デフォルトである必要があります...)。

 <wsdl:service name="ReportingServiceFoo">
    <wsdl:port binding="tns:ReportingServiceFoo" name="ReportingService">
        <soap:address location"https://myserver.com/ReportingService">
    </wsdl:port>
 </wsdl:service>

編集

ザ・

BindingProvider.ENDPOINT_ADDRESS_PROPERTY

実行時にターゲットエンドポイントを設定するために使用されます。したがって、Webサービスのエンドポイントがwsdlのエンドポイントとは異なる場合は、この方法で実際のエンドポイントに設定してください。

5
JBA