2016-08-04 1 views
1

Je tente d'utiliser une requête GET pour utiliser la fonction Amazon Mechanical Turk GetFileUploadURL. Cependant, je reçois ce code d'erreur lors de la tentative.AWSAccessKeyId non autorisé

AWS.NotAuthorized The identity contained in the request is not authorized to use this AWSAccessKeyId 

Ceci est le code que j'utilise pour créer la requête.

now = DateTime.now 

    #For creating the signature hash 
    data = "AWSMechanicalTurkRequesterGetFileUploadURL" + now.to_s 
    sha256 = OpenSSL::Digest::SHA256.new 
    sig = OpenSSL::HMAC.digest(sha256, Rails.configuration.secret_key, data) 
    signature = Base64.encode64(sig) 
    puts "https://mechanicalturk.amazonaws.com", "/?Service=AWSMechanicalTurkRequester&AWSAccessKeyId=#{Rails.configuration.aws_key}&Version=2014-08-15&Operation=GetFileUploadURL&Signature=#{sig}&Timestamp=#{now}&AssignmentId=#{mturk_results[0][:AssignmentId]}&QuestionIdentifier=file1" 

    puts "\n\n" 

    uri = URI('https://mechanicalturk.amazonaws.com') 
    params = {:Service=>"AWSMechanicalTurkRequester", :AWSAccessKeyId=>Rails.configuration.aws_key, :Version=>"2014-08-15", :Operation=>"GetFileUPloadURL", :Signature=>sig, :Timestamp=>now, :AssignmentId=>mturk_results[0][:AssignmentId], :QuestionIdentifier=>"file1"} 
    uri.query = URI.encode_www_form(params) 
    res = 0 
    Net::HTTP.start(uri.host, uri.port, 
     :use_ssl => uri.scheme == 'https') do |http| 
     request = Net::HTTP::Get.new uri 

     res = http.request request # Net::HTTPResponse object 
    end 

Des idées sur ce que je fais mal?

+0

Pourquoi ne pas utiliser le SDK officiel Ruby d'Amazon ou rturk peut-être? Peu importe, MTurk est très pointilleux sur la mise en forme de la date, donc je suppose que c'est le problème. – Thomas

+0

Impossible de trouver des fonctions dans le SDK Ruby pour récupérer les résultats de fichiers. Je reçois un fichier UploadedFileKey de getHITResults, qui contient une partie d'une URL à ajouter à une base, mais je n'ai pas pu l'utiliser. – ceaston7

Répondre

1

Vous aurez besoin de formater votre TimeStamp correctement. L'horodatage doit être au format UTC et au format ISO 8601 suivant: YYYYMMDD'T'HHMMSS'Z '. Par exemple, 20150830T123600Z est un horodatage valide. N'incluez pas les millisecondes dans l'horodatage.

Il doit être de la forme: Timestamp = 2016-04-23T08: 00: 05Z

Bien que la méthode DateTime.now Ruby les renvoie de la forme: 2016-08-05T10: 43: 27 -07: 00

Vous pouvez en savoir plus sur les signatures et Timestamp AWS ici: http://docs.aws.amazon.com/general/latest/gr/sigv4-date-handling.html

+1

Une autre astuce à considérer, j'utiliserais une méthode super simple pendant que vous travaillez sur les kinks dans votre signature d'appel AWS. GetAccountBalance est un bon candidat. Plus sur cela ici: http://docs.aws.amazon.com/AWSMechTurk/latest/AWSMturkAPI/ApiReference_GetAccountBalanceOperation.html – jrb