Comment authentifier les services Web java basés sur soap?


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.

Author: SSG, 2011-07-23

4 answers

Probablement le meilleur mais le plus complexe est 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 y a beaucoup d'options. Vous pouvez dans un cas simple, par exemple, utiliser Profil UsernameToken de sécurité des services Web

    <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 UsernameToken.

Mais dans certains, cas simplifiés vous pouvez simplement effectuer une authentification HTTP Basic sur le serveur Web (via SSL). Cela peut être la pire solution, mais parfois pourrait être plus facile à mettre en œuvre. Une autre solution, non connectée avec soap peut être authentifiée mutuellement SSL (avec authentification client).

 7
Author: zacheusz, 2011-07-23 11:16:03

Différentes manières et différents types de sécurité que nous pouvons mettre en œuvre: Sécurité au niveau des messages

  • Sécurité au niveau du transport : comme HTTP Basic / Digest et SSL
  • La sécurité au niveau du message : Comme la sécurité WS, la signature numérique XML, le cryptage XML,XKMS ( XMLK eyM anagementS spécification), XACML (eXtensibleA ccesseC {[9] il est possible de créer un lien entre les deux. Il s'agit d'un service de messagerie ebXML, Le projet Liberty Alliance. pour plus de détails
  • Sécurité du contrôle d'accès :Un rôle de sécurité est un privilège accordé aux utilisateurs ou aux groupes en fonction de conditions spécifiques.

Le plus souvent, nous utilisons WS-Security pour les services Web SOAP. A WS-profil de sécurité détermine comment WS-security est activé.

  1. Profil de jeton WSS X. 509: Utilisation le cadre X. 509 pour un profil de sécurité WSS X. 509.
  2. Profil UsernameToken WSS : Lorsque vous spécifiez le profil de jeton X. 509, vous pouvez également fournir un UsernameToken dans la demande SOAP.

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 simple en ajoutant un utilisateur et un mot de passe à l'en-tête HTTP uniquement.

Authentification d'application avec JAX-WS en utilisant WebServiceContext interface

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"));

    }
}
 7
Author: Premraj, 2017-11-11 13:03:01

WS-Security fournit le moyen standard de sécuriser les services Web basés sur SOAP et la politique WS-Security indique comment communiquer ces exigences de sécurité à out side world.

L'authentification peut être avec nom d'utilisateur/mot de passe - avec UsernameToken ou basé sur un certificat.

Puisque vous êtes basé sur Java - vous pouvez utiliser le serveur d'applications open sourceWSO2 pour déployer votre service et en quelques clics, vous pouvez sécuriser votre service.

Ceci explique en outre comment faire il...

Merci...

 3
Author: Prabath Siriwardena, 2011-08-27 11:06:45

Ici est un bon exemple pour un Webservice via JAX-WS avec authentification

 2
Author: alexblum, 2011-07-23 11:09:40