IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[Amazon Web Service] Signature requête


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 14
    Points : 7
    Points
    7
    Par défaut [Amazon Web Service] Signature requête
    Bonjour,

    Je suis actuelement en train de dévelloper une site web et j'utilisais jusqu'a présent les web services d'amazon. Mais depuis le 15 Août, il ont ajouter une sécurité et il faut maintenant signer les requetes. Et la commence les problèmes...
    Impossible de trouver le bon algorithme pour signer les requetes j'ai bien tester differents script trouver sur divers forum, mais aucun ne marche chez moi.

    Voici la fonction que j'utilise actuellement et qui ne donne pas la bonne signature...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    	public static function getAWSUrlWithSignature($url)
    	{
    		$secretKey = '***'; //caché vonlontairement
    		$publicKey = '***'; //caché vonlontairement
     
    		$tmp = split('\?', $url);
    		$root = $tmp[0];
    		$parametres = $tmp[1]."&Timestamp=".gmdate("Y-m-d\TH:i:s\Z")."&Version=2009-03-31";
     
    		$params = array();
    		$params2 = array();
    		foreach(split('&', $parametres) as $row)
    		{
    			$tmp = split('=', $row);
    			$params[] = $tmp[0].'='.urlencode($tmp[1]);
    			$params2[] = $tmp[0].urlencode($tmp[1]);
    		}
     
    		sort($params);
    		sort($params2);
     
    		$stringToSign = "GET\nwebservices.amazon.fr\n/onca/xml\n".implode('', $params2);
     
    		$params[] = 'Signature='.urlencode(base64_encode(hash_hmac('sha256', trim($stringToSign), $secretKey, true)));
     
    		return $root.'?'.implode('&', $params);
    	}
    Quelqu'un a t'il déjà ce problème? Quelqu'un se sert t'il des ces services et a réussi a signer ses requetes?

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de RideKick
    Homme Profil pro
    Directeur technique
    Inscrit en
    Septembre 2006
    Messages
    5 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2006
    Messages : 5 914
    Points : 12 572
    Points
    12 572
    Par défaut
    Hum ,
    J'ai le meme soucis mais en ruby ....jte dirais que tout les codes que j'ai essayé (meme ceux fournis par amazon) ne fonctionnent pas ....donc la c'est l'arrachage de cheveux ....

    En ce qui concerne ton code, il a l'air correct, je vois que tu passe par Rest, tu as quel message d'erreur ? celui qui dit que ta signature est différente de celle que eux calcul ?

    Je penche aussi pour un problème de TimeStamp il se pourrait que si nos serveurs n'est pas a 5 mn près la même heure que celle d'amazon , ça foire ..... a creuser.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Voila le jolie message d'erreur renvoyé par amazon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    La signature de requête que nous avons calculée ne correspond pas à la signature que vous avez fournie. Vérifiez votre clé d'accès secrète AWS et votre méthode de signature. Pour plus de détails, consultez la documentation sur ce service.
    Pour ce qui est du timestamp, il le disent dans le message d'erreur s'il est trop vieux.

  4. #4
    Rédacteur
    Avatar de RideKick
    Homme Profil pro
    Directeur technique
    Inscrit en
    Septembre 2006
    Messages
    5 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2006
    Messages : 5 914
    Points : 12 572
    Points
    12 572
    Par défaut
    Ok , j'ai le même message ....pour le timestamp je savais pas qu'ils le spécifiaient, une piste qui tombe a l'eau ....

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Le plugin Amazon pour Wordpress suivant : http://wordpress.org/extend/plugins/amazonsimpleadmin/ fonctionne correctement.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Merci!!!

    J'ai vu que le wordpress utilisé le Zend framework pour les acces à Amazon.

    J'ai donc crée ma classe s'inspirant du zend framework:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    class Amazon{
     
    	public static $secretKey = la clé privé;
    	public static $publicKey = la clé public;
    	private static $_key;
    	private static $_hashAlgorithm;
     
    	/**
    	 * Permet de creer une url pour les services amazon
    	 * @param string $operation le paramètre opération de la requete
    	 * @param array $options les autres paramètres.
    	 * @return string l'url
    	 */
        public static function createRequest($operation, array $options)
        {
            $options['AWSAccessKeyId'] = self::$publicKey;
            $options['Service']        = 'AWSECommerceService';
            $options['Operation']      = (string) $operation;
     
            $baseUri = 'http://webservices.amazon.fr';
     
            if(self::$secretKey !== null) {
                $options['Timestamp'] = gmdate("Y-m-d\TH:i:s\Z");;
                ksort($options);
                $options['Signature'] = self::computeSignature($baseUri, self::$secretKey, $options);
            }
     
            return 'http://webservices.amazon.fr/onca/xml?'.http_build_query($options, null, '&');
        }
     
        static public function computeSignature($baseUri, $secretKey, array $options)
        {
            $signature = self::buildRawSignature($baseUri, $options);
            return base64_encode(
                self::compute($secretKey, 'sha256', $signature, 'binary')
            );
        }
     
       static public function buildRawSignature($baseUri, $options)
        {
            ksort($options);
            $params = array();
            foreach($options AS $k => $v) {
                $params[] = $k."=".rawurlencode($v);
            }
     
            return sprintf("GET\n%s\n/onca/xml\n%s",
                str_replace('http://', '', $baseUri),
                implode("&", $params)
            );
        }
     
        public static function compute($key, $hash, $data, $output)
        {
            // set the key
            if (!isset($key) || empty($key)) {
                throw new Exception('provided key is null or empty');
            }
            self::$_key = $key;
     
            // set the hash
            self::_setHashAlgorithm($hash);
     
            // perform hashing and return
            return self::_hash($data, $output);
        }
     
       protected static function _setHashAlgorithm($hash)
        {
            if (!isset($hash) || empty($hash)) {
                throw new Exception('provided hash string is null or empty');
            }
     
            $hash = strtolower($hash);
            $hashSupported = false;
     
            if (function_exists('hash_algos') && in_array($hash, hash_algos())) {
                $hashSupported = true;
            }
     
            if ($hashSupported === false) {
                throw new Exception('hash algorithm provided is not supported on this PHP installation; please enable the hash or mhash extensions');
            }
            self::$_hashAlgorithm = $hash;
        }
     
        protected static function _hash($data, $output = 'string', $internal = false)
        {
            if (function_exists('hash_hmac')) {
                if ($output == 'binary') {
                    return hash_hmac(self::$_hashAlgorithm, $data, self::$_key, 1);
                }
                return hash_hmac(self::$_hashAlgorithm, $data, self::$_key);
            }
     
            if (function_exists('mhash')) {
                if ($output == 'binary') {
                    return mhash(self::_getMhashDefinition(self::$_hashAlgorithm), $data, self::$_key);
                }
                $bin = mhash(self::_getMhashDefinition(self::$_hashAlgorithm), $data, self::$_key);
                return bin2hex($bin);
            }
        }
     
        protected static function _getMhashDefinition($hashAlgorithm)
        {
            for ($i = 0; $i <= mhash_count(); $i++)
            {
                $types[mhash_get_hash_name($i)] = $i;
            }
            return $types[strtoupper($hashAlgorithm)];
        }
    }
    exemples d'utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	$url = Amazon::createRequest('BrowseNodeLookup', array(
    		'BrowseNodeId' => 409392
    	));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    		$url = Amazon::createRequest('ItemSearch', array(
    			'ResponseGroup' => 'ItemAttributes,Images,EditorialReview',
    			'BrowseNode' => 409396,
    			'SearchIndex' => DVD,
    			'ItemPage' => 1
    		));
    Donc merci encore de m'avoir aiguillé!

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Et une version php 4 pour ceux qui en ont besoin!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    class Amazon_AWS{
     
    	var $_key;
    	var $_hashAlgorithm;
     
    	/**
    	 * Permet de creer une url pour les services amazon
    	 * @param string $operation le paramètre opération de la requete
    	 * @param array $options les autres paramètres.
    	 * @return string l'url
    	 */
        function createRequest($operation, $options)
        {
    		$secretKey = la clé privée;
    		$publicKey = la clé public;
     
        	$options['AWSAccessKeyId'] = $publicKey;
            $options['Service']        = 'AWSECommerceService';
            $options['Operation']      = (string) $operation;
     
            $baseUri = 'http://webservices.amazon.fr';
     
            if($secretKey !== null) {
                $options['Timestamp'] = gmdate("Y-m-d\TH:i:s\Z");;
                ksort($options);
                $options['Signature'] = Amazon_AWS::computeSignature($baseUri, $secretKey, $options);
            }
     
            foreach($options as $k => $v)
            {
            	if($retour) $retour.= '&';
            	$retour.= $k.'='.urlencode($v);
            }
            return 'http://webservices.amazon.fr/onca/xml?'.$retour;
        }
     
        function computeSignature($baseUri, $secretKey, $options)
        {
            $signature = Amazon_AWS::buildRawSignature($baseUri, $options);
            return base64_encode(
                Amazon_AWS::compute($secretKey, 'sha256', $signature, 'binary')
            );
        }
     
       function buildRawSignature($baseUri, $options)
        {
            ksort($options);
            $params = array();
            foreach($options AS $k => $v) {
                $params[] = $k."=".rawurlencode($v);
            }
     
            return sprintf("GET\n%s\n/onca/xml\n%s",
                str_replace('http://', '', $baseUri),
                implode("&", $params)
            );
        }
     
        function compute($key, $hash, $data, $output)
        {
            // set the key
            if (!isset($key) || empty($key)) {
                //throw new Exception('provided key is null or empty');
            }
            $this->_key = $key;
     
            // set the hash
            Amazon_AWS::_setHashAlgorithm($hash);
     
            // perform hashing and return
            return Amazon_AWS::_hash($data, $output);
        }
     
       function _setHashAlgorithm($hash)
        {
            if (!isset($hash) || empty($hash)) {
                //throw new Exception('provided hash string is null or empty');
            }
     
            $hash = strtolower($hash);
            $hashSupported = true;
     
            if (function_exists('hash_algos') && in_array($hash, hash_algos())) {
                $hashSupported = true;
            }
     
            if ($hashSupported === false) {
                //throw new Exception('hash algorithm provided is not supported on this PHP installation; please enable the hash or mhash extensions');
            }
            $this->_hashAlgorithm = $hash;
        }
     
        function _hash($data, $output = 'string', $internal = false)
        {
            if (function_exists('hash_hmac')) {
                if ($output == 'binary') {
                    return hash_hmac($this->_hashAlgorithm, $data, $this->_key, 1);
                }
                return hash_hmac($this->_hashAlgorithm, $data, $this->_key);
            }
     
            if (function_exists('mhash')) {
                if ($output == 'binary') {
                    return mhash(Amazon_AWS::_getMhashDefinition($this->_hashAlgorithm), $data, $this->_key);
                }
                $bin = mhash(Amazon_AWS::_getMhashDefinition($this->_hashAlgorithm), $data, $this->_key);
                return bin2hex($bin);
            }
        }
     
        function _getMhashDefinition($hashAlgorithm)
        {
            for ($i = 0; $i <= mhash_count(); $i++)
            {
                $types[mhash_get_hash_name($i)] = $i;
            }
            return $types[strtoupper($hashAlgorithm)];
        }
    }
    elle fonctionne extactement de la meme façon

  8. #8
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    Merci pour cette version php4 mais j'ai une erreur à la ligne :

    "Fatal error: Using $this when not in object context in /home/..."

    As-tu un exemple d'utilisation de ta class?

    Merci

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Glouf,

    Le probleme viens du fait que les fonction sont utilisé de maniere static et effectivement c'est logique que ca ne marche pas! étrangement pour moi ca marche?!?

    La difference doit etre au niveau de la configuration php et apache...

    Je suis désolé je n'ai pas le temps de regarder cela pour l'instant je republierai cette classe "normalement corrigé" plus tard dans la semaine.

  10. #10
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    Merci beaucoup.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Web Service] Expiration d'une requête simple avec Amazon Web Services
    Par cyberlp dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 12/11/2010, 16h50
  2. Réponses: 0
    Dernier message: 25/10/2010, 13h38
  3. [PHP 5.3] Amazon Web Services et REST
    Par hervelyon dans le forum Langage
    Réponses: 0
    Dernier message: 23/09/2010, 17h17
  4. Réponses: 0
    Dernier message: 17/11/2009, 03h23
  5. API java pour amazon web services(amazon E-commerce Service)
    Par mehdiing dans le forum Services Web
    Réponses: 1
    Dernier message: 03/04/2008, 09h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo