2016-08-14 14 views
2

CloudKit Webサービスとの基本的な統合を実装しようとしていますが、リクエストの認証にはfollowing Apple's guideが必要です。私はthisthisという質問を適切に承認する方法を頼りにしており、すべての手順を正しく実行しているようですが、まだアップルから401 AUTHENTICATION_FAILEDエラーが出ています。サーバ間のCloudKit Webサービスへの呼び出しで認証エラーが発生しました

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, 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権限

私は私がここで間違ってやっているかわからないんだけど - 私が正しく、すべての手順を以下のように見えるん。うまくいけばログは誰かがこれが間違っているかもしれないかもしれないことを理解するのを助けることができます

答えて

4

署名する前にパラメータをJSONに変換する必要があります。署名付きコピーと同じJSON文字列を送信してください。

+0

ありがとうございました。私は、このソリューションと一致するように編集しました。うまくいけば、誰かが自分の要求にこれを使うことができることを願っています。 – Andrew

関連する問題