gars, pleeaseee aidez-moi !!!Consommer un service web avec usernametoken profil avec pwd digest
J'ai créé un service web qui utilise UserNameToken Profile security avec un type de mot de passe comme 'digest'. Quand j'essaie d'utiliser le webservice de SOAP-UI (en envoyant l'information dans la tête du xml) je peux consommer le webservice normalement, mais quand j'essaye de consommer ce webservice avec JAVA le serveur n'authentifie pas l'utilisateur.
J'essaie d'utiliser l'axe et JAX-WS (envoyer les informations dans la tête de l'enveloppe-like SOAP-UI) mais le serveur n'authentifie pas l'utilisateur.
Quelqu'un peut-il m'aider?
Voici mon code:
public void faz() throws NoSuchAlgorithmException, Exception {
/////////////////////////////////////////////////////////////
//get the timestamp, nonce and password in SHA-1 and BASE64//
/////////////////////////////////////////////////////////////
String nonce, timestamp, secret;
nonce = String.valueOf(this.hashCode());
BASE64Encoder encoder2 = new BASE64Encoder();
nonce = encoder2.encode(nonce.getBytes());
Calendar c = Calendar.getInstance();
c.setTime(new Date());
timestamp = DatatypeConverter.printDateTime(c);
timestamp = timestamp.substring(0, 19);
timestamp = timestamp+"Z";
secret = "weblogic1";
MessageDigest SHA1 = null;
try {
SHA1 = MessageDigest.getInstance("SHA1");
} catch (NoSuchAlgorithmException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
;
String beforeEncryption = nonce + timestamp + secret;
try {
SHA1.reset();
byte[] toEncrypt = beforeEncryption.getBytes("UTF-8");
SHA1.update(beforeEncryption.getBytes());
} catch (UnsupportedEncodingException uee) {
throw new RuntimeException(uee);
}
byte[] encryptedRaw = SHA1.digest();
byte[] encoded = Base64.encodeBase64(encryptedRaw);
MessageDigest digest = MessageDigest.getInstance("SHA-1");
digest.update("password".getBytes());
BASE64Encoder encoder = new BASE64Encoder();
String senha = encoder.encode(digest.digest());
System.err.println(senha);
////////////////////////////////////
//////////END //////////////////////
////////////////////////////////////
CalculaServiceService ss = new CalculaServiceServiceLocator();
CalculaService service = ss.getCalculaServicePort();
String uri = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
String uriCrea = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";
SOAPHeaderElement securityE = new SOAPHeaderElement(uri, "Security",
null);
SOAPHeaderElement tokenE = new SOAPHeaderElement(uri, "UsernameToken",
null);
SOAPHeaderElement userE = new SOAPHeaderElement(uri, "Username", null);
tokenE.setObjectValue(null);
securityE.setObjectValue(null);
userE.setValue("username");
SOAPHeaderElement pwdE = new SOAPHeaderElement(uri, "Password", null);
pwdE.addAttribute(uri, "Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest");
pwdE.setValue(senha);
SOAPHeaderElement nonceE = new SOAPHeaderElement(uri, "Nonce", null);
nonceE.addAttribute(uri, "EncodingType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest");
nonceE.setValue(nonce);
SOAPHeaderElement createdE = new SOAPHeaderElement(uriCrea, "Created", null);
createdE.setValue(timestamp);
tokenE.addChildElement(userE);
tokenE.addChildElement(pwdE);
tokenE.addChildElement(nonceE);
tokenE.addChildElement(createdE);
securityE.addChildElement(tokenE);
((Stub) service).setHeader(securityE);
service.calcula(13, 10, "somar");
}
Ok. Merci Matej. Je vais tester cela et signaler ici .... –
D'accord ... ne fonctionne pas, maintenant je reçois cette erreur: Message plus ancien que permis MessageAge. Peut-être que la configuration du serveur est incorrecte? Je vais le voir. Des idées?? –
Lignes timestamp = timestamp.substring (0, 19); et timestamp = horodatage + "Z"; puanteur. En ajoutant le "Z" à la fin, vous spécifiez que la valeur de l'heure est dans le fuseau horaire UTC. Essayez d'utiliser l'horodatage tel quel s'il contient le fuseau horaire ou spécifiez GMT TZ lors de la création de l'objet de calendrier. Si l'heure formatée est dans un fuseau horaire différent de celui de l'heure UTC, vous obtiendrez du temps dans le passé (si vous êtes en avance) ou dans le futur. Vous devez vous assurer que vous utiliserez la valeur de temps correcte (dans la période de fraîcheur), sinon le serveur rejette la tentative d'authentification comme une attaque de rejeu. Voir la spécification du profil UsernameToken, p7. – Matej