调用服务器到服务器CloudKit Web服务时出现授权错误

安德鲁

我正在尝试遵循Apple的身份验证请求指南,与CloudKit Web服务实现一些基本集成我已经按照一些帮助,这个这个问题,就是如何正确授权的请求,并且似乎是正确的以下所有步骤,但我仍然得到401AUTHENTICATION_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

最终结果是:

获救:401未经授权

我不确定自己在做什么错-我似乎确实正确地遵循了所有步骤。希望日志可以帮助某人了解这可能在哪里出错。

亚历山大·艾克斯(Alexsander Akers)

您需要在签名之前将参数转换为JSON。并确保发送与签名副本相同的JSON字符串。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

CloudKit服务器到服务器身份验证

来自分类Dev

CloudKit和Web服务器

来自分类Dev

401客户端“协商”,服务器“协商,NTLM”调用WCF服务器到服务器时

来自分类Dev

在服务器内部调用Web服务

来自分类Dev

调用 POST 方法时出现内部服务器错误

来自分类Dev

部署到流星服务器时出现ENOENT错误

来自分类Dev

部署到流星服务器时出现ENOENT错误

来自分类Dev

多服务器到单服务器

来自分类Dev

与IBM SBT的服务器到服务器通信

来自分类Dev

服务器到服务器回发

来自分类Dev

服务器到服务器 OAuth

来自分类Dev

通过HTTP调用RESTFUL Web API时出现500服务器错误

来自分类Dev

从客户端到服务器(流星)调用方法

来自分类Dev

ASMX到64位服务器中的COM调用

来自分类Dev

Android到服务器500错误

来自分类Dev

Android到Web服务器的问题

来自分类Dev

使用C#上传文件时出现远程服务器错误(401)未经授权

来自分类Dev

多授权服务器

来自分类Dev

GRPC Java将数据从服务器拦截器传递到rpc服务调用

来自分类Dev

远程服务器返回错误500-调用Soap Web服务时出错

来自分类Dev

从javascript调用Flask服务器上的Web服务方法

来自分类Dev

使用jQuery在远程服务器上调用Web服务

来自分类Dev

Web 服务部署到生产服务器

来自分类Dev

Thinktecture Identity服务器与授权服务器

来自分类Dev

从Windows PE调用Chef服务器

来自分类Dev

来自WebAPI的服务器调用图像

来自分类Dev

在viewDidLoad中执行对服务器的调用

来自分类Dev

从Windows PE调用Chef服务器

来自分类Dev

在服务器上调用Perl函数