And*_*rew 4 ruby openssl ruby-on-rails cloudkit cloudkit-web-services
我正在尝试实施与CloudKit Web服务的一些基本集成,遵循Apple的身份验证请求指南.我已经按照一些帮助,这个和这个问题,就是如何正确授权的请求,并且似乎是正确的以下所有步骤,但我仍然得到401 AUTHENTICATION_FAILED苹果错误.
我定位的端点是一个POST端点,用于在给定记录名称的情况下检索记录.
我在我的代码中添加了注释,以显示我在不同阶段获得的输出,并且我使用了替代证书,因此我没有提供我的正版私钥:
def self.signature(parameters, date, image_id)
#date: 2016-08-14T14:32:20Z
#parameters: {"records":[{"recordName":"7DBC4FAD-D18C-476A-89FB-14A515098F34"}]}
encoded_parameters = Digest::SHA256.base64digest(parameters)
#encoded_parameters: 6gmJ4AvmJgkNY4SJm6ImOxZaZ07J7cih/tRXI0zkRjQ=
url_subpath = CloudKit.url_subpath
#url_subpath: /database/1/iCloud.ProjectDent.TwIM/development/public/records/lookup
message = date + ':' + encoded_parameters + ':' + url_subpath
#message: 2016-08-14T14:23:35Z:6gmJ4AvmJgkNY4SJm6ImOxZaZ07J7cih/tRXI0zkRjQ=:/database/1/iCloud.ProjectDent.TwIM/development/public/records/lookup
private_key = OpenSSL::PKey.read(File.read('altkey.pem'))
signature = private_key.dsa_sign_asn1(OpenSSL::Digest::SHA256.digest(message))
#signature: -? WX?xfc???????,????v?3+Xt!?$R?_Y?×*?,?3??Z-\#????h
encoded_signature = Base64.strict_encode64(signature)
#encoded_signature: MEUCIFdYlHhmrxoIY8KW1tT6yZT17bYsP8ia09WTdpEzK1h0AiEA0yRSh39fWYHDlyqJLNgzhr9aLVwj2cWtkse3aA0tGZI=
return encoded_signature
end
def self.headers(parameters, image_id)
date = Time.now.utc.iso8601
signature = self.signature(parameters, date, image_id)
headers = {
'X-Apple-CloudKit-Request-KeyID' => CloudKit.key_id,
'X-Apple-CloudKit-Request-ISO8601Date' => date,
'X-Apple-CloudKit-Request-SignatureV1' => signature
}
#headers (key id masked): {"X-Apple-CloudKit-Request-KeyID"=>"123456", "X-Apple-CloudKit-Request-ISO8601Date"=>"2016-08-14T14:32:20Z", "X-Apple-CloudKit-Request-SignatureV1"=>"MEUCIFdYlHhmrxoIY8KW1tT6yZT17bYsP8ia09WTdpEzK1h0AiEA0yRSh39fWYHDlyqJLNgzhr9aLVwj2cWtkse3aA0tGZI="}
return headers
end
def self.fetch_image(image_id)
url = CloudKit.url
parameters = CloudKit.parameters(image_id).to_json
headers = CloudKit.headers(parameters, image_id)
begin
response = RestClient.post(url, parameters, headers)
puts 'response'
puts response.code
puts response.to_str
rescue => e
puts 'rescued: ' + e.to_s
end
end
Run Code Online (Sandbox Code Playgroud)
最终结果是:
获救:401未经授权
我不确定我在这里做错了什么 - 我似乎正确地遵循所有步骤.希望日志可以帮助人们了解这可能出错的地方.
| 归档时间: |
|
| 查看次数: |
217 次 |
| 最近记录: |