ruby-on-rails – 调用服务器到服务器CloudKit Web服务时的授权
发布时间:2020-12-17 02:56:37 所属栏目:百科 来源:网络整理
导读:我正在尝试与CloudKit Web服务实现一些基本集成,following Apple’s guide用于验证请求.我已经在 this和 this问题上提供了一些关于如何正确授权请求的帮助,并且似乎正确地遵循了所有步骤,但我仍然从Apple获得了401 AUTHENTICATION_FAILED错误. The endpoint
我正在尝试与CloudKit Web服务实现一些基本集成,following Apple’s guide用于验证请求.我已经在
this和
this问题上提供了一些关于如何正确授权请求的帮助,并且似乎正确地遵循了所有步骤,但我仍然从Apple获得了401 AUTHENTICATION_FAILED错误.
The endpoint I’m targeting是用于在给定记录名称的情况下检索记录的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,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 最终结果是:
我不确定我在这里做错了什么 – 我似乎正确地遵循所有步骤.希望日志可以帮助人们了解这可能出错的地方. 解决方法
您需要在签名之前将参数转换为JSON.并确保发送与签名副本相同的JSON字符串.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |