JAX WS client ne peut pas authentifier
Je suis en train de consommer une procédure sécurisée (HTTPS schéma) web-service, avec l'aide de la norme JAVA 7 JAX WS outils.
Ce web-service qui nécessite une authentification.
J'ai déjà réussi à ajouter un certificat à mon local java fichier de clés.
Tous ont besoin les classes que j'ai généré à partir du fichier WSDL avec l'aide de wsimport
outil.
Maintenant, je suis en train d'utiliser l'appel suivant pour exécuter un test simple:
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);
}
}
Quand je lance le test qu'il me donne de l'exception suivante:
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
Comme vous le voyez, j'ai essayé d'appliquer les trois techniques différentes de l'authentification, mais sans succès. Exception est la même dans les trois cas.
Ce que je fais mal?
P. S. si je tente d'accéder WSDL dans le navigateur les informations d'identification que j'utilise dans le code de la faire fonctionner correctement.
Bien savez-vous quel type d'Authentification est nécessaire?
nan, je ne suis pas sûr que le type d'authentification est requis. Mais comme vous pouvez le voir, j'ai déjà essayé d'utiliser tous les types que j'ai trouvé jusqu'à présent.
pourriez-vous essayer l'une de ces deux suggestions?
L'authentification doit être l'authentification HTTP de Base.
OriginalL'auteur Alexander Arendar | 2014-03-14
Vous devez vous connecter pour publier un commentaire.
Votre problème n'est pas relatif à un certificat SSL. Votre question est relative à l'Authentification. Instance de Service doivent être en mesure d'accéder WSDL contenu (à l'avant de votre talon invoquer web réelle méthode), mais Il a échoué, c'est pourquoi vous avez cette erreur.
Vous avez 2 solutions:
Registre par défaut Authentificateur:
Télécharger le document WSDL et de l'enregistrer pour le LOCAL d'entreposage et l'utilisation locale du fichier WSDL.
Pour cette solution, vous devez créer une instance de Service, de ne PAS utiliser le code généré comme vous l'avez fait.
Solution 1 en utilisant l'initialisation Statique pour l'authentification -> l'authentification est partagé par TOUS client généré talons. La Solution 2 est nécessaire si différents des stubs client peut avoir d'autre nom d'utilisateur/mot de passe.
ok, initialisation statique a fonctionné pour moi. J'avais aussi une stupide erreur dans mon code où je l'ai mis authentification statique extrait APRÈS l'initialisation du webservice et le port. Donc après j'ai pensé à elle tout a très bien fonctionné.
Au lieu de faire de la solution 1 si j'utilise BindingProvider prov = (BindingProvider) port; prov.getRequestContext().mettre(BindingProvider.USERNAME_PROPERTY, "nom d'utilisateur"); prov.getRequestContext().mettre(BindingProvider.PASSWORD_PROPERTY, "Mot de passe"); devrait-il travailler ?
OriginalL'auteur Loc
Permet d'essayer plusieurs choses:
1.) Savez-vous quel type d'Authentification que le serveur attend?
2.) Lorsque vous essayez d'accéder https://reporting-stage.admp.mtv3.adtlgc.com/admp/ReportingService?wsdl voyez-vous quelque chose? par exemple, je suppose, est une IP en liste Blanche ou quelque chose et vous permettra d'entrer les informations d'identification ou similaire? Parce que je ne peux pas voir quoi que ce soit là.
3.) Quand il s'agit du code que j'ai authentifier garanti webservice sur HTTP de cette façon:
Ensemble au-dessus de point de terminaison de biens à ce qui est stocké dans votre wsdl du wsdl:port... et je m'attends à ressembler à quelque chose comme ceci (et devrait être la valeur par défaut...):
Modifier:
La
est utilisé pour définir la cible-fin de l'étude au moment de l'exécution. Donc, si le webservice a un autre point de terminaison de celle du wsdl assurez-vous de mettre à la terminaison de cette façon.
O. k. afin de faar si bonne, ce qui signifie que l'authentification fonctionne comme dans la plupart de nos services... avez-vous encore essayé "mon" code ci-dessus (je ne vois pas beaucoup de différence, mais permet simplement de l'essayer
essayer... sera mise à jour lors de toute progression
adresse de cette WSDL élément est différente de l'adresse réelle que le webservice est en cours d'exécution sur. J'ai été informé par un développeur que cela ne devrait pas être un problème puisque l'adresse dans le <soap:address> élément est juste une adresse par défaut alors que le webservice peut être déployé dans d'autres URL.
Exactement (désolé c'est un peu de clarté dans la réponse ci-dessus), c'est pourquoi j'utilise BindingProvider.ENDPOINT_ADDRESS_PROPERTY pour définir l'adresse sur les services de terminaison au moment de l'exécution (pour remplacer celui par défaut du fichier WSDL). Ainsi, après tout ce que vous avez tryied?
OriginalL'auteur JBA