Dunque. La richiesta purtroppo è fatta in modo corretto e il metodo WSSE non l'ho scelto io, me lo hanno imposto. Mi sono creato un file di log per vedere se appunto la chiamata fosse fatta in modo corretto, e infatti è ok.
Il mio unico problema è proprio creare una pagina, un listener appunto che mi accetti nell'header questo tipo di token, utilizzando la funzione getallheaders di PHP ad esempio.
L'unica indicazione che ho ricevuto per creare il listener è stata:
public static function wsseIsValid(){
$time = time();
$wsseRegex = '/UsernameToken Username="([^"]+)", PasswordDigest="([^"]+)", Nonce="([^"]+)", Created="([^"]+)"/';
$token = "L'HEADER WSSE PRESO DALLA RICHIESTA"
if( $token == NULL || 1 !== preg_match( $wsseRegex, $token, $matches ) ) {
return FALSE;
}
$userName = $matches[ 1 ];
$digest = $matches[ 2 ];
$nonce = $matches[ 3 ];
$created = $matches[ 4 ];
if( strtotime( $created ) > $time ) {
throw new Exception( 'DESCRIZIONE ERRORE', 'CODICE CHE VUOI USARE PER QUESTO ERRORE' );
}
if( $time - strtotime( $created ) > 300 ) {
throw new Exception( 'DESCRIZIONE ERRORE', 'CODICE CHE VUOI USARE PER QUESTO ERRORE' );
}
// CARICA L'UTENTE $userName (preso sopra) DA DB O DA CONFIGURAZIONE, COME VUOI TU, PER RECUPERARE LA PASSWORD
$passwordUser = "PRENDO LA PASSWORD DELL'UTENTE $userName CARICATO"; //
// SE LA TUA $passwordUser è salvata nel db in chiaro è ok, altrimenti la dovresti decodificarla
// RICREI IL DIGEST COSÌ, SE IL DIGEST CHE TI E' ARRIVATO E' UGUALE A QUELLO CHE HAI GENERATO ALLORA E' OK
$expected = base64_encode( sha1( $nonce . $created . $passwordUser, TRUE ) );
return $digest === $expected;
Ho provato ad usarla, ma con scarso esito, mi ritorna sempre internal server error e non credo per quel ";" che manca, ma credo per la versione di PHP che utilizzo (5.2.5) che forse non supporta questo tipo di funzione, per questo avevo optato per una più "semplice" getallheaders.

Rispondi quotando