|
| Iniciado por benoit.vincent, 14,abr. 2016 17:37 - 4 respuestas |
| |
| | | |
|
| |
| Publicado el 14,abril 2016 - 17:37 |
Bonjour à tous. Je cherche à consommer un webservice développé en java par l'intermédiaire de mon application windev. Ce webservice est sécurisé par l'intermédiaire d'un password digest, ce qui, je l'ai bien compris, n'est pas pris en charge par les fonction SOAP standard (import de wsdl dans windev). Pour info: https://www.oasis-open.org/committees/download.php/13392/wss-v1.1-spec-pr-UsernameTokenProfile-01.htm C'est bien dommage qu'un standard tel que celui-ci ne soit pas intégré, mais c'est un autre sujet.
Je passe donc par un SOAPExecuteXML, mais avant, je me dois de calculer le contenu de la balise wsse:Password (de type passworddigest) en fonction d'une clef connue (mon password), de l'heure (wsse:Created), et d'une valeur générée (wsse:Nonce)...
Dans le lien ci dessus, la règle de calcule est détaillée : Password_Digest = Base64 ( SHA-1 ( nonce + created + password ) )
J'ai tout bêtement pensé à ça : sPasswordDigest est une chaîne = Crypte(HashChaîne(HA_SHA_160 , sNonce + sCreated + sPassword), "", compresseAucun + crypteAucun, encodeBASE64)
Mais visiblement, c'est un peu plus compliqué... J'ai une fonction Java, qui marche, mais que je n'ai pas réussi à reproduire (passage par des "tableau dynamique d'entier sans signe sur 1 octet, etc...)
public static String getPasswordDigest(String nonce, String created, String password) { if (nonce == null) { return null; } if (created == null) { return null; } if (password == null) { return null; } byte[] nonceBytes = Base64.getDecoder().decode(nonce); byte[] createdBytes = null; try { createdBytes = created.getBytes(codingUTF8); } catch (UnsupportedEncodingException uee) { return null; } byte[] passwordBytes = null; try { passwordBytes = password.getBytes(codingUTF8); } catch (UnsupportedEncodingException uee) { return null; } byte[] concatenatedBytes = new byte[nonceBytes.length + createdBytes.length + passwordBytes.length]; int offset = 0; System.arraycopy(nonceBytes, 0, concatenatedBytes, offset, nonceBytes.length); offset += nonceBytes.length; System.arraycopy(createdBytes, 0, concatenatedBytes, offset, createdBytes.length); offset += createdBytes.length; System.arraycopy(passwordBytes, 0, concatenatedBytes, offset, passwordBytes.length); System.out.println("concatenatedBytes = " + concatenatedBytes.toString()); MessageDigest messageDigest = null; try { // messageDigest = MessageDigest.getInstance(algorithmSHA); messageDigest = MessageDigest.getInstance(algorithmSHA1); } catch (NoSuchAlgorithmException nsae) { return null; } messageDigest.update(concatenatedBytes);
String passwordDigest = Base64.getEncoder().encodeToString(messageDigest.digest());
return passwordDigest; }
Donc si qq'un à une idée.... Merci beaucoup d'avance. |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 7 mensajes |
|
| Publicado el 15,abril 2016 - 14:16 |
Je me répond à moi même: - contrairement à ce que j'ai inscrit dans mon premier post, j'utilisais le H_HMAC_SHA_160 au lieu de H_HSA_160....
La fonction suivante fait le job...mais faut peut etre rajouter des contrôle :
Procedure PROC_GenerePasswordDigest(sNonce est une chaîne, sCreated est une chaîne, sPassword est chaîne)
bufNonceDecode est un Buffer = Décrypte(ChaîneVersUTF8(sNonce), "", crypteAucun,encodeBASE64) bufCreated est un Buffer = ChaîneVersUTF8(sCreated) bufPassword est un Buffer = ChaîneVersUTF8(sPassword) bufConcat est un Buffer = bufNonceDecode + bufCreated + bufPassword bufSHA1 est un Buffer = HashChaîne(HA_SHA_160,bufConcat) sPasswordDigest est une chaîne = Crypte(bufSHA1,"",compresseAucun+crypteAucun,encodeBASE64)
RENVOYER sPasswordDigest
Bonne journée à tous. |
| |
| |
| | | |
|
| | |
| |
| Publicado el 02,mayo 2016 - 13:51 |
salut, benoit. comment fais tu pour passer ton wss-secutity à ton webservice? un soapajouteentete ou bien juste une manip de chaine xml et ensuite un soapexecutexml ? et comment recuperes-tu les éléments dans les structures de ton ws ?
Merci de ton aide. |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 7 mensajes |
|
| Publicado el 02,mayo 2016 - 14:35 |
Bonjour Phig. Je ne suis pas arrivé à qq chose de concluant avec un SOAPAjouteEntete... J'ai donc un model xml que je complète:
sXMLBase = [ <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ws="http://ws.integrance.com/"> <soap:Header> <wsse:Security soap:mustUnderstand="true" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <wsse:UsernameToken wsu:Id="%1"> <wsse:Username>%2</wsse:Username> <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%3</wsse:Password> <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">%4</wsse:Nonce> <wsu:Created>%5</wsu:Created> </wsse:UsernameToken> </wsse:Security> </soap:Header> <soap:Body> %6 </soap:Body> </soap:Envelope> ]
sUsernameTokenId est une chaîne = PROC_GenereUsernameToken() sUsername est une chaîne = "*******" sPassword est une chaîne = "******" sNonce est une chaîne = PROC_GenereNonce() sCreated est une chaîne = PROC_GenereCreated() sPasswordDigest est une chaîne = PROC_GenerePasswordDigest(sNonce,sCreated,sPassword)
sBody est une chaîne = [ ....... ]
sXMLSoap est une chaîne = ChaîneConstruit(sXMLBase,sUsernameTokenId,sUsername,sPasswordDigest, sNonce, sCreated, sBody)
SOAPExécuteXML(sUrlServeurSOAP,sXMLSoap,"<Methode WS appelée>")
Concernant la récupération, j'ai quand même importé le wsdl du webservice afin de définir mes structures réceptrices. J'ai aussi du rajouter, mais je ne sais pas si c'est du à mon webservice ou pas, un entete et un pied à la réponse du webservice afin que ce soit pris en charge par la fonction Désérialise.
Donc :
sXMLDeb est une chaîne = [ <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> <soap:Body> <ns2:<Type de retour> xmlns:ns2="<urlWS>"> <return> ] sXMLFin est une chaîne = [ </return> </ns2:<Type de retour>> </soap:Body> </soap:Envelope> ]
sResultat = UnicodeVersAnsi(SOAPDonneRésultat(SOAPRésultat)) sData est une chaîne = sXMLDeb + sResultat + sXMLFin sData = Remplace(sData,"/>","/>"+RC+TAB) sData = Remplace(sData,"><",">"+RC+"<")
<Type de retour> est un <Structure Type de retour> Désérialise(<Type de retour>,sData,psdXML)
Normalement, ça doit le faire...
Mais je suis preneur de tout conseil  |
| |
| |
| | | |
|
| | |
| |
| Publicado el 11,febrero 2020 - 13:22 |
Salut Benoit,
Quel code tu utilises pour generer le UsernameToken et le Nonce?
Merci |
| |
| |
| | | |
|
| | | | |
| | |
|