ruby on rails - सर्वर-टू-सर्वर मेल्डकिट वेब सेवाओं को कॉल करने पर प्राधिकरण त्रुटि



ruby-on-rails openssl (1)

हस्ताक्षर करने से पहले आपको मापदंडों को JSON में परिवर्तित करना होगा। और हस्ताक्षर किए प्रति के रूप में एक ही JSON स्ट्रिंग भेजने के लिए सुनिश्चित करें।

मैं अनुरोधों प्रमाणीकरण के लिए एप्पल की मार्गदर्शिका के अनुसरण में , बादलकिट वेब सेवाओं के साथ कुछ बुनियादी एकीकरण को लागू करने का प्रयास कर रहा हूं। मैंने इस से और इस प्रश्न से कुछ मदद का पालन किया है कि कैसे ठीक से अनुरोधों को अधिकृत किया जाए, और सभी चरणों का सही ढंग से पालन किया जा रहा है, लेकिन मुझे अभी भी एप्पल से 401 AUTHENTICATION_FAILED त्रुटि मिल रही है।

अंतिम लक्ष्य मैं एक लक्ष्य को प्राप्त करने के लिए एक डाक समापन बिंदु है, एक रिकॉर्ड नाम दिया।

मैंने विभिन्न चरणों में प्राप्त होने वाले आउटपुट को दिखाने के लिए अपने कोड में टिप्पणियां जोड़ दी हैं, और मैंने एक वैकल्पिक प्रमाण पत्र का उपयोग किया है इसलिए मैं अपनी वास्तविक निजी कुंजी प्रदान नहीं कर रहा हूं:

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 अनधिकृत

मुझे यकीन नहीं है कि मैं यहाँ क्या गलत कर रहा हूं - मुझे लगता है कि सभी चरणों का सही ढंग से अनुसरण करना है I उम्मीद है कि लॉग यह जानने में मदद कर सकता है कि यह गलत क्यों हो रहा है