2016-08-29 6 views
0

Rubyを使用してIvona Speech Cloudにアクセスしようとしています。RubyでIvonaスピーチクラウドにアクセス

私がRubyに見いだしたコード例の1つを移植しましたが、エラーが発生しているので、おそらく要求の認証に何か間違っていました。

これは私の実装です:

require 'http' # the gem 
require 'openssl' 
require 'pp' 

def sign key, date, region, service, text 
    k_date = OpenSSL::HMAC.digest('sha256', "AWS4" + key, date) 
    k_region = OpenSSL::HMAC.digest('sha256', k_date, region) 
    k_service = OpenSSL::HMAC.digest('sha256', k_region, service) 
    k_signing = OpenSSL::HMAC.digest('sha256', k_service, "aws4_request") 
    signature = OpenSSL::HMAC.digest('sha256', k_signing, text) 
    signature 
end 

def run 
    access_key = "GDxxxxxxxxxxxxxxxxRA" 
    secret_key = "QtxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxlE" 

    region = 'eu-west-1' 
    date  = '20160808' 
    service = 'tts' 
    body  = {"Input" => {"Data" => "Hello world"}} 
    endpoint = "https://#{service}.#{region}.ivonacloud.com/CreateSpeech" 
    signature = sign secret_key, date, region, service, 'Hello World' 

    headers = { 
    "Content-Type" =>"application/json", 
    "Authorization" => "AWS4-HMAC-SHA256", 
    "Credential" => "#{access_key}/#{date}/#{region}/#{service}/aws4_request", 
    "SignedHeaders" => "content-type;host;x-amz-content-sha256;x-amz-date", 
    "Signature" => "#{signature}", 
    } 

    res = HTTP.headers(headers).post(endpoint, json: body) 
    p res 
end 

run 

これは私が(読みやすくするため破線)を取得していますエラーです:

#<HTTP::Response/1.1 403 Forbidden 
{"X-Amzn-Requestid"=>"18a44dd8-6dc3-11e6-808f-975692d1ee55", 
    "X-Amzn-Errortype"=>"IncompleteSignatureException:http://internal.amazon.com/coral/com.amazon.coral.service/", 
    "Content-Type"=>"application/json", 
    "Content-Length"=>"293", 
    "Date"=>"Mon, 29 Aug 2016 08:32:18 GMT"}> 

どのような援助が

答えて

1

を高く評価している私が使用することをお勧めしますAWS4これを助ける宝石。次の形式で同様の呼び出しを行いました。

signer = ::AWS4::Signer.new(
    access_key: "YOUR_ACCESS_KEY", 
    secret_key: "YOUR_SECRET_KEY", 
    region: "us-east-1" 
) 

aws_headers = { 
    "Content-Type" => "application/json; charset=utf8", 
    "Date" => Time.now.iso8601.to_s, 
    "Host" => "tts.us-east-1.ivonacloud.com" 
} 

uri = URI(endpoint) 
body_params = {"Input":{"Data":"Hello world"}}.to_json 

headers = signer.sign("POST", uri, aws_headers, body_params) 
res = HTTP.headers(headers).post(endpoint, body: body_params) 
+0

お試しいただきありがとうございます。宝石は維持されていないようだが、私はそれを撃つだろう。 – DannyB

+0

この作業はどちらでもできます。 'endpoint =" https://tts.us-east-1.ivonacloud.com/CreateSpeech "'を追加し、403の応答を禁止しました。 – DannyB

+0

成功! (以前のコメントのように)エンドポイントを追加し、 'res = HTTP.headers(ヘッダ).post(エンドポイント、body:body_params)'へのリクエストを 'json'ではなく' body'で変更するだけです。 – DannyB

関連する問題