将python转换为ruby params问题

时间:2017-07-22 02:58:16

标签: ruby-on-rails ruby

我将一些python代码转换为ruby。它到目前为止还没问题,除了我遇到一些参数问题。 python代码是:

def sign_policy(policy):
  signed_policy = base64.b64encode(policy)
  signature = base64.b64encode(hmac.new(
    app.config.get('AWS_CLIENT_SECRET_KEY'), signed_policy, hashlib.sha1).
    digest())
  return { 'policy': signed_policy, 'signature': signature }

def sign_headers(headers):
  headers = bytearray(headers, 'utf-8')  # hmac doesn't want unicode
  return {
    'signature': base64.b64encode(hmac.new(
        app.config.get('AWS_CLIENT_SECRET_KEY'), headers, hashlib.sha1).
        digest())
  }

def s3_signature():
  request_payload = request.get_json()
  if request_payload.get('headers'):
      response_data = sign_headers(request_payload['headers']) 
  else:
      response_data = sign_policy(request.data)
  return jsonify(response_data)

到目前为止,我的红宝石版本是:

def create
  puts params[:headers]
  if params[:headers].present?
    response_data = sign_headers(params[:headers]) 
  else
    response_data = sign_policy(params)
  end
  render json: response_data
end

private

def sign_policy(policy)
  signed_policy = Base64.encode64(policy).gsub("\n","")

  signature = Base64.encode64(
    OpenSSL::HMAC.digest(
      OpenSSL::Digest.new('sha1'), 
      AWS_SECRET_KEY, signed_policy)
  ).gsub("\n","")

  return { 'policy': signed_policy, 'signature': signature }
end

def sign_headers(headers)
  #headers = bytearray(headers, 'utf-8')
  return {
    'signature':  Base64.encode64(
    OpenSSL::HMAC.digest(   
      AWS_SECRET_KEY, headers, OpenSSL::Digest.new('sha1')
    ))
  }
end

我遇到了以下问题:no implicit conversion of ActionController::Parameters into String,这显然有什么不对(Params是一个哈希,它需要是一个字符串)..然而,在python中传递的是什么码?我错过了我应该传递的东西吗?

1 个答案:

答案 0 :(得分:1)

很可能您需要传递单个值,String或任何其他值,这取决于您需要传递以使用Base64.encode64(policy)的数据类型。

当您在params[:headers]方法调用中传递sign_headers时,如果是sign_policy调用,则您传递params,这是整个ActionController::Parameters 1}},尝试调试您在params上发送的值以发送所需的值。