我将一些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中传递的是什么码?我错过了我应该传递的东西吗?
答案 0 :(得分:1)
很可能您需要传递单个值,String或任何其他值,这取决于您需要传递以使用Base64.encode64(policy)
的数据类型。
当您在params[:headers]
方法调用中传递sign_headers
时,如果是sign_policy
调用,则您传递params
,这是整个ActionController::Parameters
1}},尝试调试您在params
上发送的值以发送所需的值。