web-dev-qa-db-fra.com

Comment authentifier les services Web basés sur Java Java?

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.

16
SSG

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

8
zacheusz

Différentes manières et différents types de sécurité que nous pouvons implémenter: Sécurité au niveau des messages

  • Sécurité au niveau du transport : Tels que HTTP Basic/Digest et SSL
  • Sécurité au niveau des messages : Tels que WS-Security, signature numérique XML, chiffrement XML, XKMS ( [~ # ~ ] x [~ # ~] ML [~ # ~] k [~ # ~] ey [~ # ~] m [~ # ~] gestion [~ # ~] s [~ # ~] spécification), XACML (e [~ # ~] x [~ # ~] tensible [~ # ~] a [~ # ~] ccess [~ # ~] c [~ # ~] ontrol [~ # ~] m [~ # ~] arkup [~ # ~] l [~ # ~] anguage), SAML ( [~ # ~] s [~ # ~] ecure [~ # ~] une [~ # ~] insertion [~ # ~] m [~ # ~] arkup [~ # ~] l [~ # ~] anguage), ebXML Message Service, The Liberty Alliance Project. pour plus de détails
  • Sécurité du contrôle d'accès : Un rôle de sécurité est un privilège accordé à des utilisateurs ou à des groupes en fonction de conditions spécifiques.

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.

  1. Profil de jeton WSS X.509: Utilisez le framework X.509 pour un profil de sécurité WSS X.509.
  2. Profil WSS UsernameToken : Lorsque vous spécifiez le profil de jeton X.509, vous pouvez également fournir un nom d'utilisateurToken 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 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"));

    }
}
8
Premraj

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

3
Prabath Siriwardena

ici est un bon exemple pour un service Web via JAX-WS avec authentification

2
alexblum