cloudstack-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Anantha Kasetty <Anantha.Kase...@citrix.com>
Subject Re: Having trouble getting a CloudStack API URL with api_key and generated signature to work from the browser (Firefox).
Date Tue, 12 Jun 2012 11:37:38 GMT
Good catch.

The signature generation converts the url to lowercase but the case should
be preserved when submitting it to CloudStack.



regards,
Anantha Kasetty 
408-242-8317
Anantha.Kasetty@citrix.com










On 6/12/12 4:31 AM, "Prasanna Santhanam" <Prasanna.Santhanam@citrix.com>
wrote:

>On Sat, Jun 09, 2012 at 09:52:07AM -0400, Anantha Kasetty wrote:
>> Had to dust up my long forgotten Perl skills,  here is a sample program
>> 
>> use URI::Escape;
>> use Digest::SHA qw(hmac_sha1_base64);
>> 
>> sub hmac_digest {
>>     my $uri = shift @_;
>>     my $key = shift @_;
>> 
>>     $digest = hmac_sha1_base64($uri, $key);
>> 
>>     #@#$%! perl does not pad the output of base64
>> 
>>     while (length($digest) % 4) {
>>         $digest .= '=';
>>     }   
>>     return $digest;
>> }
>> 
>> sub escape_hash {
>>     my %hash = @_;
>>     my @pairs;
>>     
>>     for my $key (sort keys %hash) {
>>         push @pairs, join "=", map { uri_escape($_) } lc($key),
>> lc($hash{$key});
>>     }   
>>     return join "&", @pairs;
>> }
>> 
>> my $secret_key =
>> 
>>'kNd2VxlXxCXwyJGlidr0ZcmcqXSH2refwxZTStD6If4vJu4QmJPOIui0rgr88mDI6DuGQTzP
>>9e
>> QNOjlZBTReKg' ;
>> 
>> 
>> my $uri = escape_hash(
>> 
>>'apikey'=>'8v_gevjjgdjbbhibmlle4yyhkseqhrefztnv4up2fu3k9y12th7lscsn6-7sea
>>go
>> 1ycctnute1ot0v7npcus8q',
>>                        'command'=>'listZones',
>>                        'response'=>'json');
>> 
>> $signature = uri_escape(hmac_digest($uri, $secret_key));
>> 
>> $uri .= "&signature=$signature";
>> print "$uri\n";
>> 
>
>This didn't quite work when run but does give out the same signature as my
>python script below that works. The only difference I see is that the
>arguments
>in the final request in your script is lower cased but in my script I
>retain
>the case.
>
>root@cloud:~# perl api_sign.pl
>BdHeONSolrYr92FE04%2FLkuAVCjA%3D
>apikey=ssszixygqdb4v4lvdtezasmrtjqi-wwnphd-3_fra5esibrikgclxwobhryhldsl3ay
>i7heedww0rtwhk9thew&command=listzones&response=json&signature=BdHeONSolrYr
>92FE04%2FLkuAVCjA%3D
>
>root@cloud:~# python api_sign.py
>BdHeONSolrYr92FE04%2FLkuAVCjA%3D
>apiKey=SssziXYGqdB4V4lvdTeZasmrTJQi-WWNphD-3_FRa5EsibrIkgcLXwoBHRyhlDsl3aY
>I7heEdWW0RtwhK9thew&command=listZones&response=json&signature=BdHeONSolrYr
>92FE04%2FLkuAVCjA%3D
>
>
>#!/usr/bin/env python
>import urllib2
>import urllib
>import hmac
>import hashlib
>import base64
>
>def make_request(requests, secretKey):
>        request = zip(requests.keys(), requests.values())
>        request.sort(key=lambda x: str.lower(x[0]))
>
>        requestUrl = "&".join(["=".join([r[0],
>urllib.quote_plus(str(r[1]))]) for r in request])
>        hashStr = "&".join(["=".join([str.lower(r[0]),
>str.lower(urllib.quote_plus(str(r[1]))).replace("+", "%20")]) for r in
>request])
>        sig = urllib.quote_plus(base64.encodestring(hmac.new(secretKey,
>hashStr, hashlib.sha1).digest()).strip())
>        print "Signature: %s"%sig
>        requestUrl += "&signature=%s"%sig
>        print requestUrl
>
>if __name__ == '__main__':
>    requests = {
>                "apiKey":
>"SssziXYGqdB4V4lvdTeZasmrTJQi-WWNphD-3_FRa5EsibrIkgcLXwoBHRyhlDsl3aYI7heEd
>WW0RtwhK9thew",
>                "response" : "json",
>                "command" : "listZones"
>               }
>    secretKey = 
>"dKGxVNF_mcBq_ZhvO9YY7lzQzkckdRQ-CQ5MIAymQYhvt141_6j-AVwGbtmjoswh84uvv_r_G
>FOIF9hWHoZaXw"
>    make_request(requests, secretKey)
>
>
>
>I'll put all the examples in different languages on the wiki because
>this will come up in the future on the lists. Any takers for a Ruby/.NET
>implementation?
>
>
>-- 
>Prasanna.,


Mime
View raw message