Je développe des services Web basés sur Soap en utilisant Java. Quelqu'un peut-il me faire savoir comment authentifier le client qui consomme les services Web?
Merci.
Le meilleur mais le plus complexe est probablement WS-Security avec diverses méthodes d'authentification. Mais c'est le plus complexe et c'est bon pour l'environnement d'entreprise. Il vous permet de créer une authentification de bout en bout et il existe de nombreuses options. Vous pouvez dans un cas simple, par exemple utiliser Profil de sécurité des services Web UsernameToken
<S12:Envelope xmlns:S11="..." xmlns:wsse="..." xmlns:wsu= "...">
<S12:Header>
...
<wsse:Security>
<wsse:UsernameToken>
<wsse:Username>NNK</wsse:Username>
<wsse:Password Type="...#PasswordDigest">weYI3nXd8LjMNVksCKFV8t3rgHh3Rw==</wsse:Password>
<wsse:Nonce>WScqanjCEAC4mQoBE07sAQ==</wsse:Nonce>
<wsu:Created>2003-07-16T01:24:32</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
...
</S12:Header>
...
</S12:Envelope>
Je ne sais pas quelle bibliothèque vous utilisez, mais voici un bel article comment installer Rampart dans Axis2 et implémenter 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). Cela peut être la pire solution, mais parfois plus facile à mettre en œuvre. Une autre solution, non connectée à soap, peut être SSL authentifiée mutuellement (avec authentification client).
Différentes manières et différents types de sécurité que nous pouvons implémenter: Sécurité au niveau des messages
Le plus souvent, nous utilisons WS-Security pour SOAP Web Services. A WS-security profile détermine comment la sécurité WS est activée.
exemple:
<wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="SecurityToken-6138db82-5a4c-4bf7-915f-af7a10d9ae96">
<wsse:Username>user</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">CBb7a2itQDgxVkqYnFtggUxtuqk=</wsse:Password>
<wsse:Nonce>5ABcqPZWb6ImI2E6tob8MQ==</wsse:Nonce>
<wsu:Created>2010-06-08T07:26:50Z</wsu:Created>
</wsse:UsernameToken>
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.setAttribute("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(nonceString.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 un simple ajout d'utilisateur et de 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 String getHelloWorldAsString(String 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");
String username = "";
String password = "";
if (usernameList != null) {
username = usernameList.get(0).toString();
}
if (passwordList != null) {
password = passwordList.get(0).toString();
}
// 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(String[] 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<String, Object> requestContext = ((BindingProvider)sayHello).getRequestContext();
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://localhost:8888/webservice/helloworld?wsdl");
Map<String, List<String>> requestHeaders = new HashMap<String, List<String>>();
requestHeaders.put("username", Collections.singletonList("nikos"));
requestHeaders.put("Password", Collections.singletonList("superpassword"));
requestContext.put(MessageContext.HTTP_REQUEST_HEADERS, requestHeaders);
System.out.println(sayHello.getHelloWorldAsString("- This is Java Code Geeks"));
}
}
WS-Security fournit le moyen standard de sécuriser les services Web basés sur SOAP et la politique de sécurité WS indique comment communiquer ces exigences de sécurité au monde extérieur.
L'authentification peut être avec un nom d'utilisateur/mot de passe - avec un nom d'utilisateur ou un certificat.
Puisque vous êtes Java - vous pouvez utiliser l'open source WSO2 Application Server pour déployer votre service et en quelques clics vous pouvez sécuriser votre service.
This explique plus en détail comment le faire ...
Merci...
ici est un bon exemple pour un service Web via JAX-WS avec authentification