iphone - टरन - नेट पर डाले हुए फोटो




आईफोन ऐप और एस 3 से फोटो अपलोड करने के बारे में वास्तुकला और डिजाइन सवाल (4)

मैं एक आईफोन ऐप के उपयोगकर्ताओं को तस्वीरें अपलोड करने और अमेज़ॅन एस 3 का उपयोग करने की अनुमति देना चाहता हूं। इसके बारे में 2 तरीके हैं जिन्हें मैं देख रहा हूं:

  1. आईफोन से अपने सर्वर पर अपलोड करें, जो इसे अमेज़ॅन एस 3 पर प्रॉक्सी करता है।
  2. सीधे आईफोन से एस 3 पर अपलोड करें

विकल्प 1 के लिए, सुरक्षा सरल है। मुझे कभी भी आईफोन को अपने एस 3 रहस्य को बताना नहीं है। डाउनसाइड यह है कि सब कुछ हमारे सर्वर के माध्यम से अपलोड के लिए प्रॉक्सी किया जाता है जो एस 3 पर जाने के उद्देश्य को हरा देता है।

विकल्प 2 के लिए, सिद्धांत रूप में यह बेहतर है लेकिन मुद्दा यह है कि आप इसे अपने रहस्य के बिना अपने एस 3 बाल्टी में लिखने के लिए आईफोन (या किसी भिन्न मंच पर किसी भी मोबाइल ऐप) को कैसे सक्षम करते हैं? इसके अतिरिक्त, मुझे यकीन नहीं है कि यह एक अच्छा डिज़ाइन है या नहीं, क्योंकि प्रवाह होगा: एस 3 पर आईफोन अपलोड करता है, यूआरएल प्राप्त करता है, फिर सर्वर को बताता है कि यूआरएल क्या है ताकि यह इसे हमारे डेटाबेस में संदर्भित करने के लिए जोड़ सके भविष्य। हालांकि, चूंकि संचार 2 पैरों (आईफोन-> एस 3 बनाम आईफोन-> माई-सर्वर) में अलग हो गया है, इसलिए यह गैर-परमाणु संचालन के रूप में इसे नाजुक छोड़ देता है।

मुझे कुछ पुरानी जानकारी मिली है जो POST का उपयोग कर ब्राउज़र-आधारित अपलोड का उपयोग कर संदर्भ देती है लेकिन यह सुनिश्चित नहीं है कि यह अभी भी अनुशंसित दृष्टिकोण है। मैं एक बेहतर समाधान की उम्मीद कर रहा हूं जहां हम पोस्ट पर भरोसा करने के बजाय केवल आरईएसटी एपीआई का उपयोग कर सकते हैं। मैंने एडब्ल्यूएस आईओएस बीटा एसडीके भी देखा है, लेकिन उनके दस्तावेज़ों ने बहुत मदद नहीं की है और मुझे एक अमेज़ॅन लेख मिला जो समान रूप से अनुपयोगी था क्योंकि यह आपको चेतावनी देता है कि क्या नहीं करना है, लेकिन आपको वैकल्पिक दृष्टिकोण नहीं बताता है:

मोबाइल एडब्ल्यूएस एसडीके अनुरोध करते हुए एडब्ल्यूएस खाते की पहचान को सत्यापित करने के लिए अमेज़ॅन वेब सर्विसेज (एडब्लूएस) को भेजे गए एपीआई अनुरोधों पर हस्ताक्षर करते हैं। अन्यथा, एक दुर्भावनापूर्ण डेवलपर आसानी से किसी अन्य डेवलपर के बुनियादी ढांचे के लिए अनुरोध कर सकता है। एडब्ल्यूएस एक्सेस कुंजी आईडी और एडब्ल्यूएस प्रदान करता है कि एक गुप्त एक्सेस कुंजी का उपयोग कर अनुरोध पर हस्ताक्षर किए गए हैं। गुप्त पहुंच कुंजी एक पासवर्ड के समान है, और गुप्त रखने के लिए यह बेहद महत्वपूर्ण है।

युक्ति: आप एडब्ल्यूएस वेब साइट पर http://aws.amazon.com/security-credentials पर एक्सेस कुंजी आईडी और गुप्त एक्सेस कुंजी सहित अपने सभी एडब्ल्यूएस सुरक्षा प्रमाण-पत्र देख सकते हैं।

स्रोत कोड में क्रेडेंशियल एम्बेड करना मोबाइल एप्लिकेशन सहित सॉफ़्टवेयर के लिए समस्याग्रस्त है, क्योंकि दुर्भावनापूर्ण उपयोगकर्ता सॉफ़्टवेयर को डि-संकलित कर सकते हैं या गुप्त एक्सेस कुंजी पुनर्प्राप्त करने के लिए स्रोत कोड देख सकते हैं।

क्या किसी के पास सर्वश्रेष्ठ वास्तुशिल्प डिजाइन और इसके लिए प्रवाह पर कोई सलाह है?

अपडेट करें: जितना अधिक मैं इसमें खोदता हूं, ऐसा लगता है कि लोगों का एक गुच्छा जेएसओ नीति फ़ाइल के साथ HTTP पोस्ट विधि का उपयोग करने की सिफारिश करता है जैसा कि यहां वर्णित है: http://docs.amazonwebservices.com/AmazonS3/2006-03-01/dev /index.html?UsingHTTPPOST.html

इसके साथ, प्रवाह कुछ ऐसा होगा (1) आईफोन मेरे सर्वर से अनुरोध करता है, पॉलिसी फाइल पूछने के लिए पूछता है (2) सर्वर जेसन पॉलिसी फाइल जेनरेट करता है और क्लाइंट को वापस देता है (3) आईफोन फोटो के HTTP पोस्ट करता है + जेसन पॉलिसी एस 3 । मुझे नफरत है कि मैं एक स्पष्ट रूप से क्लॉजी तरीके से HTTP पोस्ट का उपयोग कर रहा हूं लेकिन यह बेहतर प्रतीत होता है क्योंकि यह मेरे सर्वर को फोटो स्टोर करने की आवश्यकता को हटा देता है।


अपने सर्वर पर अपलोड करें और फिर एस 3 पर पोस्ट करें। एक आर्किटेक्चर दृष्टिकोण से आप इसे अपने सर्वर से करना चाहेंगे। ऐसी कई चीजें हैं जो डेटा ट्रांसफर के दौरान गलत हो सकती हैं, जो आप सर्वर पर बेहतर संभाल सकते हैं और यदि आप उस छवि के बारे में कोई भी डेटा स्टोर करना चाहते हैं जिसे आप S3 पर भेज रहे हैं, तो संभवतया आप सर्वर साइड कॉल के लिए जा रहे हैं।

इसके अलावा, आपकी गुप्त पहुंच कुंजी को अधिक सुरक्षित वातावरण में संग्रहीत किया जाता है। अपनी खुद की।

यदि आप स्केलेबिलिटी के बारे में चिंतित हैं और आप बड़ी संख्या में एस 3 ट्रांसफर कर रहे हैं तो मैं आपके सर्वर को होस्ट करने और ईसी 2 इंस्टेंस पर विचार करने पर विचार करूंगा। दोनों के बीच डेटा स्थानांतरित करना निःशुल्क है (आपको डेटा केंद्रों में डेटा स्टोर करने के बाद)।

अमेज़ॅन ईसी 2 और अमेज़ॅन एस 3 के बीच उसी क्षेत्र के भीतर या अमेज़ॅन ईसी 2 उत्तरी वर्जीनिया क्षेत्र और अमेज़ॅन एस 3 यूएस मानक क्षेत्र के बीच स्थानांतरित डेटा के लिए स्थानांतरित डेटा के लिए कोई डाटा ट्रांसफर शुल्क नहीं है। " अमेज़ॅन सरल संग्रहण सेवा (अमेज़ॅन एस 3)

एसओ अमेज़ॅन - ईसी 2 लागत पर यहां कई पोस्ट हैं? (उदाहरण) ईसी 2 का उपयोग करने के पेशेवरों और विपक्ष के बारे में।


उन्होंने इस उद्देश्य के लिए एसडीके प्रदान किया होगा कि शायद व्यक्तिगत एस 3 खातों में प्रमाणीकरण की अनुमति दे सकती है? उदाहरण के लिए एक ऐप जो उपयोगकर्ताओं को प्रदाता के बजाए फ़ाइलों को अपने (उपयोगकर्ता की) बाल्टी में स्टोर करने देता है? मुझे एप्लिकेशन के साथ कुंजियों को विलय करने और इसे वितरित करने में सुरक्षा त्रुटियां महसूस होती हैं। कुंजियों को किसी भी तरह प्रकट होने के बाद कोई भी (गलत) उनका उपयोग कर सकता है (जब आप इसे बाहर निकाल रहे होते हैं तो यह कभी सुरक्षित नहीं होता है)। दूसरी तरफ, सर्वर पर आरक्षित कार्यक्षमता को बनाए रखना आपकी चाबियों को उपयोगकर्ता के लिए पारदर्शी रखेगा, है ना?


मैंने पहले इस मुद्दे पर एडब्ल्यूएस मंचों पर चर्चा की है। जैसा कि मैंने वहां कहा है, मोबाइल डिवाइस से एडब्ल्यूएस तक पहुंचने का उचित समाधान प्रत्येक उपयोगकर्ता के लिए अस्थायी, सीमित-विशेषाधिकार पहुंच कुंजी उत्पन्न करने के लिए एडब्ल्यूएस पहचान और एक्सेस प्रबंधन सेवा का उपयोग करना है। सेवा बहुत बढ़िया है, लेकिन यह अभी भी बीटा में है और यह अभी तक मोबाइल एसडीके का हिस्सा नहीं है। एक बार यह चीज़ अच्छी हो जाने के बाद मुझे महसूस हो रहा है, आप तुरंत बाद में मोबाइल एसडीके पर इसे देखेंगे।

तब तक, अपने उपयोगकर्ताओं के लिए निर्धारित यूआरएल उत्पन्न करें, या प्रॉक्सी को अपने सर्वर के माध्यम से कुछ अन्य लोगों ने सुझाव दिया है। निर्धारित यूआरएल आपके उपयोगकर्ताओं को वास्तव में आपके क्रेडेंशियल्स के बिना अस्थायी रूप से एक एस 3 ऑब्जेक्ट को प्राप्त या PUT करने की अनुमति देगा (वे हस्ताक्षर में हैं)। आप here विवरण के बारे में पढ़ सकते हैं।

संपादित करें : मैंने आईएएम के पूर्वावलोकन बीटा का उपयोग करके इस समस्या के लिए एक उचित समाधान लागू किया है। यह गिटहब पर available है, और आप इसके बारे में यहां पढ़ सकते हैं


आप आरईएसटी एपीआई का उपयोग कर सीधे अपने आईफोन से एस 3 तक अपलोड कर सकते हैं, और सर्वर को Authorization शीर्षलेख मान के हिस्से को उत्पन्न करने के लिए ज़िम्मेदार होना चाहिए जिसके लिए गुप्त कुंजी की आवश्यकता होती है। इस तरह, आप जेलब्रोकन आईफोन वाले किसी भी व्यक्ति के लिए एक्सेस कुंजी को उजागर करने का जोखिम नहीं उठाते हैं, जबकि आप सर्वर पर फ़ाइल अपलोड करने का बोझ नहीं डालते हैं। बनाने के अनुरोध का सटीक विवरण " अनुरोध ऑब्जेक्ट पुट" के तहत "आरईएसटी अनुरोधों को हस्ताक्षर करने और प्रमाणीकरण" के तहत पाया जा सकता है। मैं आगे बढ़ने से पहले उस दस्तावेज़ को पढ़ने की दृढ़ता से अनुशंसा करता हूं।

पाइथन में लिखे गए निम्नलिखित कोड, Authorization शीर्षलेख मान का हिस्सा उत्पन्न करते हैं जो आपकी S3 गुप्त पहुंच कुंजी से प्राप्त होता है। आपको क्रमशः _S3_SECRET और _S3_BUCKET_NAME लिए वर्चुअल होस्ट फॉर्म में अपनी गुप्त पहुंच कुंजी और बाल्टी नाम को प्रतिस्थापित करना चाहिए:

import base64
from datetime import datetime
import hmac
import sha

# Replace these values.
_S3_SECRET = "my-s3-secret"
_S3_BUCKET_NAME = "my-bucket-name"

def get_upload_header_values(content_type, filename): 
  now = datetime.utcnow()
  date_string = now.strftime("%a, %d %b %Y %H:%M:%S +0000")
  full_pathname = '/%s/%s' % (_S3_BUCKET_NAME, filename)
  string_to_sign = "PUT\n\n%s\n%s\n%s" % (
      content_type, date_string, full_pathname)
  h = hmac.new(_S3_SECRET, string_to_sign, sha)
  auth_string = base64.encodestring(h.digest()).strip()
  return (date_string, auth_string)

फ़ाइल नाम foo.txt और सामग्री-प्रकार text/plain उपज के साथ इसे कॉल करना:

>>> get_upload_header_values('text/plain', 'foo.txt')
('Wed, 06 Feb 2013 00:57:45 +0000', 'EUSj3g70aEsEqSyPT/GojZmY8eI=')

ध्यान दें कि यदि आप इस कोड को चलाते हैं, तो लौटाया समय अलग होगा, और इसलिए एन्कोडेड एचएमएसी पाचन अलग होगा।

अब आईफोन क्लाइंट को लौटाई गई तारीख और एचएमएसी डाइजेस्ट का उपयोग करके एस 3 को पुट अनुरोध जारी करना होगा। ऐसा मानते हुए

  • सर्वर सर्वर date_string नामक कुछ JSON ऑब्जेक्ट में उपरोक्त date_string और auth_string देता है
  • आपकी एस 3 एक्सेस कुंजी (आपका रहस्य नहीं, जो केवल सर्वर पर है) का नाम kS3AccessKey
  • आपका एस 3 बाल्टी नाम (उपरोक्त my-bucket-name सेट) को kS3BucketName नाम दिया kS3BucketName
  • फ़ाइल सामग्रियों को नामित NSData ऑब्जेक्ट में मार्शल किया जाता है
  • सर्वर पर भेजा गया filename नाम filename नाम नामक एक स्ट्रिंग है
  • सर्वर पर भेजा गया सामग्री-प्रकार सामग्री टाइप नामक एक स्ट्रिंग है

फिर आप NSURLRequest बनाने के लिए निम्न कार्य कर सकते हैं:

NSString *serverDate = [serverJson objectForKey:@"date"]
NSString *serverHmacDigest = [serverJson objectForKey:@"hmacDigest"]

// Create the headers.
NSMutableDictionary *headers = [[NSMutableDictionary alloc] init];
[headers setObject:contentType forKey:@"Content-Type"];
NSString *host = [NSString stringWithFormat:@"%@.s3.amazonaws.com", kS3BucketName]
[headers setObject:host forKey:@"Host"];
[headers setObject:serverDate forKey:@"Date"];
NSString *authorization = [NSString stringWithFormat:@"AWS %@:%@", kS3AccessKey, serverHmacDigest];
[headers setObject:authorization forKey:@"Authorization"];

// Create the request.
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setAllHTTPHeaderFields:headers];
[request setHTTPBody:data];
[request setHTTPMethod:@"PUT"];
NSString *postUrl = [NSString stringWithFormat:@"http://%@.s3.amazonaws.com/%@", kS3BucketName, filename];
[request setURL:[NSURL URLWithString:postUrl]];

इसके बाद आप अनुरोध जारी कर सकते हैं। यदि आप उत्कृष्ट AFNetworking लाइब्रेरी का उपयोग कर रहे हैं, तो आप XMLDocumentRequestOperationWithRequest:success:failure: का उपयोग करके AFXMLRequestOperation ऑब्जेक्ट में request को लपेट सकते हैं XMLDocumentRequestOperationWithRequest:success:failure: और फिर इसकी start विधि का आह्वान startheaders रिलीज करना और पूरा होने पर request करना न भूलें।

ध्यान दें कि क्लाइंट को सर्वर से Date शीर्षलेख का मान मिला है। ऐसा इसलिए है क्योंकि, अमेज़ॅन "टाइम स्टाम्प आवश्यकता" के तहत वर्णन करता है:

"प्रमाणीकृत अनुरोधों के लिए एक मान्य समय टिकट (या तो HTTP दिनांक शीर्षलेख या x-amz-date विकल्प का उपयोग करना) अनिवार्य अनुरोधों के लिए अनिवार्य है। इसके अलावा, प्रमाणीकृत अनुरोध के साथ शामिल क्लाइंट टाइम-स्टैम्प अमेज़ॅन एस 3 सिस्टम समय के 15 मिनट के भीतर होना चाहिए जब अनुरोध प्राप्त होता है। यदि नहीं, तो अनुरोध RequestTimeTooSkewed त्रुटि स्थिति कोड के साथ विफल हो जाएगा। "

तो सफल होने के अनुरोध के लिए सही समय रखने वाले क्लाइंट पर भरोसा करने के बजाय, सर्वर पर भरोसा करें, जो एनटीपी (और ntpd तरह एक ntpd ) का उपयोग करना चाहिए।





amazon-s3