Je développe des services Web basés sur Soap en utilisant Java. Quelqu’un peut-il me dire comment authentifier le client qui utilise les services Web?
Merci.
Probablement le meilleur mais le plus complexe est WS-Security avec différentes méthodes d’authentification. Mais c’est très complexe et c’est bon pour l’environnement de l’entreprise. Il vous permet de créer une authentification de bout en bout et propose de nombreuses options. Vous pouvez dans un cas simple, par exemple utiliser Web Services Security Nom d’utilisateurToken Profil
... NNK weYI3nXd8LjMNVksCKFV8t3rgHh3Rw== WScqanjCEAC4mQoBE07sAQ== 2003-07-16T01:24:32 ... ...
Je ne sais pas quelle bibliothèque vous utilisez, mais voici un article intéressant sur l’installation de Rampart dans Axis2 et la mise en œuvre de la gestion de UsernameToken .
Mais dans certains cas simplifiés, vous pouvez simplement effectuer l’authentification HTTP de base sur le serveur Web (via SSL). C’est peut-être la pire solution, mais il peut parfois être plus simple à mettre en œuvre. Une autre solution, non connectée à soap, peut être l’authentification mutuelle SSL (avec l’autorisation du client).
Différents moyens et types de sécurité que nous pouvons implémenter: Sécurité au niveau du message
Le plus souvent, nous utilisons WS-Security for SOAP Web Services. Un profil de sécurité WS détermine la façon dont la sécurité WS est activée.
Exemple:
user CBb7a2itQDgxVkqYnFtggUxtuqk= 5ABcqPZWb6ImI2E6tob8MQ== 2010-06-08T07:26:50Z
L’élément ci-dessus inclut dans l’en-tête SOAP comme suit:
SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope(); SOAPHeader header = envelope.addHeader(); SOAPElement security = header.addChildElement("Security", "wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"); SOAPElement usernameToken = security.addChildElement("UsernameToken", "wsse"); SOAPElement username = usernameToken.addChildElement("Username", "wsse"); username.addTextNode(user); SOAPElement password = usernameToken.addChildElement("Password", "wsse"); password.setAtsortingbute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest"); password.addTextNode(encodedPass); //encodedPass = Base64 ( SHA-1 ( nonce + created + password ) ) SOAPElement nonce = usernameToken.addChildElement("Nonce", "wsse"); nonce.addTextNode(Base64.encodeBytes(nonceSsortingng.getBytes())); SOAPElement created = usernameToken.addChildElement("Created", "wsu","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"); created.addTextNode(creatTime);
L’exemple suivant est simple, ajout d’un utilisateur et d’un mot de passe à l’en-tête HTTP uniquement.
Authentification d’application avec JAX-WS à l’aide de l’interface WebServiceContext
WebServiceImpl.java
package com.javacodegeeks.enterprise.ws; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.jws.WebService; import javax.xml.ws.WebServiceContext; import javax.xml.ws.handler.MessageContext; @WebService(endpointInterface = "com.javacodegeeks.enterprise.ws.WebServiceInterface") public class WebServiceImpl implements WebServiceInterface { @Resource WebServiceContext webServiceContext; @Override public Ssortingng getHelloWorldAsSsortingng(Ssortingng str) { MessageContext messageContext = webServiceContext.getMessageContext(); // get request headers Map,?> requestHeaders = (Map,?>) messageContext.get(MessageContext.HTTP_REQUEST_HEADERS); List> usernameList = (List>) requestHeaders.get("username"); List> passwordList = (List>) requestHeaders.get("password"); Ssortingng username = ""; Ssortingng password = ""; if (usernameList != null) { username = usernameList.get(0).toSsortingng(); } if (passwordList != null) { password = passwordList.get(0).toSsortingng(); } // of course this is not real validation // you should validate your users from stored databases credentials if (username.equals("nikos") && password.equals("superpassword")) { return "Valid User :"+str; } else { return "Unknown User!"; } } }
WebServiceClient.java
package com.javacodegeeks.enterprise.ws.client; import java.net.URL; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.namespace.QName; import javax.xml.ws.BindingProvider; import javax.xml.ws.Service; import javax.xml.ws.handler.MessageContext; import com.javacodegeeks.enterprise.ws.WebServiceInterface; public class WebServiceClient{ public static void main(Ssortingng[] args) throws Exception { URL wsdlUrl = new URL("http://localhost:8888/webservice/helloworld?wsdl"); //qualifier name ... QName qname = new QName("http://ws.enterprise.javacodegeeks.com/", "WebServiceImplService"); Service service = Service.create(wsdlUrl, qname); WebServiceInterface sayHello = service.getPort(WebServiceInterface.class); Map requestContext = ((BindingProvider)sayHello).getRequestContext(); requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://localhost:8888/webservice/helloworld?wsdl"); Map> requestHeaders = new HashMap>(); requestHeaders.put("username", Collections.singletonList("nikos")); requestHeaders.put("Password", Collections.singletonList("superpassword")); requestContext.put(MessageContext.HTTP_REQUEST_HEADERS, requestHeaders); System.out.println(sayHello.getHelloWorldAsSsortingng("- This is Java Code Geeks")); } }
WS-Security fournit le moyen standard de sécuriser les services Web basés sur SOAP et la stratégie WS-Security explique comment communiquer ces exigences de sécurité au monde extérieur.
L’authentification peut être avec un nom d’utilisateur / mot de passe – avec UsernameToken ou basé sur un certificate.
Puisque vous êtes basé sur Java, vous pouvez utiliser le serveur d’applications WSO2 open source pour déployer votre service et en quelques clics, vous pouvez sécuriser votre service.
Cela explique comment le faire …
Merci…
Voici un bon exemple de service Web via JAX-WS avec authentification