ক্লায়েন্ট ব্রাউজার থেকে অ্যামাজন এস 3 সরাসরি ফাইল আপলোড - ব্যক্তিগত কী প্রকাশ


159

আমি কোনও সার্ভার-সাইড কোড ছাড়াই কেবল জাভাস্ক্রিপ্ট ব্যবহার করে REST এপিআইয়ের মাধ্যমে ক্লায়েন্ট মেশিন থেকে অ্যামাজন এস 3 এ সরাসরি ফাইল আপলোড প্রয়োগ করছি। সমস্ত কাজ ঠিকঠাক তবে একটি জিনিস আমাকে চিন্তিত করছে ...

আমি যখন আমাজন এস 3 আরএসটি এপিআইতে একটি অনুরোধ প্রেরণ করি তখন আমাকে অনুরোধটি স্বাক্ষর করতে হবে এবং Authenticationশিরোনামটি শিরোনামে রেখে দেওয়া উচিত। একটি স্বাক্ষর তৈরি করতে, আমার অবশ্যই আমার গোপন কীটি ব্যবহার করতে হবে। তবে সমস্ত কিছু ক্লায়েন্টের পক্ষেই ঘটে, সুতরাং, গোপন কীটি পৃষ্ঠার উত্স থেকে সহজেই প্রকাশ করা যেতে পারে (এমনকি আমি আমার উত্সগুলিকে অবহেলা / এনক্রিপ্ট করলেও)।

আমি কীভাবে এটি পরিচালনা করতে পারি? এবং এটা কি আদৌ কোনও সমস্যা? সম্ভবত আমি নির্দিষ্ট বেসরকারী কী ব্যবহার কেবলমাত্র একটি নির্দিষ্ট সিওআরএস উত্স থেকে কেবলমাত্র এসইপি এপি কলগুলিতে সীমাবদ্ধ করতে পারি এবং কেবল পুট এবং পোস্ট পদ্ধতিতে বা কেবল এস 3 এবং নির্দিষ্ট বালতির সাথে কী লিঙ্ক করতে পারি? অন্য প্রমাণীকরণ পদ্ধতি আছে?

"সার্ভারলেস" সমাধানটি আদর্শ, তবে আমি আমার সার্ভারে কোনও ফাইল আপলোড বাদ দিয়ে কিছু সার্ভারসাইড প্রক্রিয়াকরণ জড়িত বিবেচনা করতে পারি এবং তারপরে S3 এ প্রেরণ করতে পারি।


7
খুব সহজ: কোনও গোপনীয় ক্লায়েন্ট-সাইড সংরক্ষণ করবেন না। অনুরোধটি স্বাক্ষর করতে আপনাকে একটি সার্ভার জড়িত করতে হবে।
রায় নিকোলাস

1
আপনি দেখতে পাবেন যে এই অনুরোধগুলিতে স্বাক্ষর করা এবং বেস -৪৪ এনকোডিং করা সার্ভার-সাইডটি খুব সহজ। এখানে কোনও সার্ভার জড়িত হওয়া মোটেই অযৌক্তিক বলে মনে হয় না। আমি বুঝতে পারি না যে সমস্ত ফাইল বাইটগুলি কোনও সার্ভারে এবং তারপরে এস 3-তে প্রেরণ করতে চাইছি না, তবে অনুরোধের ক্লায়েন্ট-সাইডে স্বাক্ষর করার খুব সামান্য উপকার হবে, বিশেষত যেহেতু ক্লায়েন্ট-সাইডটি করা কিছুটা চ্যালেঞ্জিং এবং সম্ভাব্য ধীর হবে (জাভাস্ক্রিপ্টে)
রায় নিকোলাস

5
এটি 2016, সার্ভারলেস আর্কিটেকচারটি বেশ জনপ্রিয় হয়ে উঠায়, ডাব্লুএস ল্যাম্বদার সাহায্যে সরাসরি এস 3-তে ফাইল আপলোড করা সম্ভব। অনুরূপ প্রশ্নের আমার উত্তর দেখুন: stackoverflow.com/a/40828683/2504317 মূলত আপনি প্রতিটি ফাইলের জন্য একটি API স্বাক্ষরকারী আপলোড-সক্ষম URL হিসাবে একটি ল্যাম্বডা ফাংশন রাখতে চান এবং আপনার ক্লাইন্ড-সাইড জাভাস্ক্রিপ্টটি কেবল একটি HTTP PUT করতে হবে প্রাক স্বাক্ষরিত ইউআরএল। আমি এই জাতীয় জিনিসগুলি করে একটি ভ্যু উপাদান লিখেছি, এস 3 আপলোড সম্পর্কিত কোডটি লাইব্রেরি অজ্ঞেস্টিক, একবার দেখুন এবং ধারণাটি পান।
কেএফ লিন

এইচটিটিপি / এস পোস্টের জন্য অন্য কোনও তৃতীয় পক্ষ কোনও এস 3 বালতিতে আপলোড করুন। জেএস 3 আপলোড খাঁটি এইচটিএমএল 5: jfileupload.com/products/js3upload-html5/index.html
জেএফইউ

উত্তর:


215

আমি মনে করি আপনি যা চান তা হ'ল পোষ্ট ব্যবহার করে ব্রাউজার ভিত্তিক আপলোড।

মূলত, আপনার সার্ভার-সাইড কোডের দরকার নেই, তবে এটি যা যা করা হয় তা সই করা নীতিগুলি তৈরি করে। ক্লায়েন্ট-সাইড কোডটিতে স্বাক্ষরিত নীতিটি হয়ে গেলে, এটি আপনার সার্ভারের মধ্যে দিয়ে ডেটা ছাড়াই POST ব্যবহার করে সরাসরি S3 এ আপলোড করতে পারে।

এখানে অফিসিয়াল ডকের লিঙ্কগুলি রয়েছে:

চিত্র: http://docs.aws.amazon.com/AmamaSS3/latest/dev/USSHTTPPOST.html

উদাহরণ কোড: HTTP

স্বাক্ষরিত নীতিটি আপনার এইচটিএমএলে এই জাতীয় ফর্ম হিসাবে যাবে:

<html>
  <head>
    ...
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    ...
  </head>
  <body>
  ...
  <form action="http://johnsmith.s3.amazonaws.com/" method="post" enctype="multipart/form-data">
    Key to upload: <input type="input" name="key" value="user/eric/" /><br />
    <input type="hidden" name="acl" value="public-read" />
    <input type="hidden" name="success_action_redirect" value="http://johnsmith.s3.amazonaws.com/successful_upload.html" />
    Content-Type: <input type="input" name="Content-Type" value="image/jpeg" /><br />
    <input type="hidden" name="x-amz-meta-uuid" value="14365123651274" />
    Tags for File: <input type="input" name="x-amz-meta-tag" value="" /><br />
    <input type="hidden" name="AWSAccessKeyId" value="AKIAIOSFODNN7EXAMPLE" />
    <input type="hidden" name="Policy" value="POLICY" />
    <input type="hidden" name="Signature" value="SIGNATURE" />
    File: <input type="file" name="file" /> <br />
    <!-- The elements after this will be ignored -->
    <input type="submit" name="submit" value="Upload to Amazon S3" />
  </form>
  ...
</html>

লক্ষ্য করুন ফোরামের কর্মটি ফাইলটি সরাসরি এস 3 -এ পাঠাচ্ছে - আপনার সার্ভারের মাধ্যমে নয়।

আপনার ব্যবহারকারীদের প্রতিটি সময় এক একটি ফাইল আপলোড করতে চায়, আপনি তৈরি করবে POLICYএবং SIGNATUREআপনার সার্ভারে। আপনি পৃষ্ঠাটি ব্যবহারকারীর ব্রাউজারে ফিরিয়ে দিন। এর পরে ব্যবহারকারী আপনার সার্ভারের মাধ্যমে না গিয়ে সরাসরি এস 3 এ একটি ফাইল আপলোড করতে পারে।

আপনি যখন নীতিতে স্বাক্ষর করেন, আপনি সাধারণত কয়েক মিনিটের পরে নীতিটির মেয়াদ শেষ করে দেন। এটি আপনার ব্যবহারকারীদের আপলোড করার আগে আপনার সার্ভারের সাথে কথা বলতে বাধ্য করে। এটি যদি আপনি চান তবে আপলোডগুলি নিরীক্ষণ এবং সীমাবদ্ধ করতে দেয়।

আপনার সার্ভারে বা কেবল যাওয়া ডেটা হ'ল স্বাক্ষরিত ইউআরএল। আপনার গোপন কীগুলি সার্ভারে গোপন থাকে।


14
দয়া করে নোট করুন যে এটি সিগনেচার ভি 2 ব্যবহার করে যা শীঘ্রই ভি 4 দ্বারা প্রতিস্থাপন করা হবে: ডকস.আও.সামাজান
আমাজান এস

9
${filename}মূল নামটি যুক্ত করতে খুব নিশ্চিত হন , সুতরাং উপরের উদাহরণের জন্য, ন্যায়বিচারের user/eric/${filename}পরিবর্তে user/eric। যদি user/ericইতিমধ্যে বিদ্যমান ফোল্ডারটি থাকে তবে আপলোডটি নিঃশব্দে ব্যর্থ হয়ে যায় (আপনি এমনকি সাফল্য_অ্যাকশন_প্রদেশের দিকেও পুনঃনির্দেশিত হবেন) এবং আপলোড করা সামগ্রী সেখানে থাকবে না। এই ভাবনাটি ডিবাগ করার জন্য কয়েক ঘন্টা সময় ব্যয় করা এটি একটি অনুমতির সমস্যা।
বালিন্ট এর্দি

@secretmike আপনি যদি এই পদ্ধতিটি সম্পাদন করে একটি সময়সীমা পেয়ে থাকেন তবে কীভাবে আপনি এটিকে বাতিল করার পরামর্শ দিবেন?
ট্রিপ

1
@ ট্রিপ যেহেতু ব্রাউজারটি ফাইলটি এস 3-তে প্রেরণ করছে তাই আপনাকে জাভাস্ক্রিপ্টের সময়সীমা সনাক্ত করতে হবে এবং নিজেকে আবার চেষ্টা করতে হবে।
সিক্রেটমেক

@secretmike যে গন্ধ একটি অসীম লুপ চক্রের মতো। সময়সীমা 10 / এমবিএসের বেশি যে কোনও ফাইলের জন্য অনির্দিষ্টকালের জন্য পুনরাবৃত্তি হতে চলেছে।
ট্রিপ

40

আপনি এডাব্লুএস এস 3 কগনিটো দ্বারা এটি করতে পারেন এই লিঙ্কটি এখানে চেষ্টা করুন:

http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/browser-examples.html#Amazon_S3

এছাড়াও এই কোড ব্যবহার করে দেখুন

কেবল অঞ্চল, পরিচয়পুলআইডি এবং আপনার বালতির নাম পরিবর্তন করুন

<!DOCTYPE html>
<html>

<head>
    <title>AWS S3 File Upload</title>
    <script src="https://sdk.amazonaws.com/js/aws-sdk-2.1.12.min.js"></script>
</head>

<body>
    <input type="file" id="file-chooser" />
    <button id="upload-button">Upload to S3</button>
    <div id="results"></div>
    <script type="text/javascript">
    AWS.config.region = 'your-region'; // 1. Enter your region

    AWS.config.credentials = new AWS.CognitoIdentityCredentials({
        IdentityPoolId: 'your-IdentityPoolId' // 2. Enter your identity pool
    });

    AWS.config.credentials.get(function(err) {
        if (err) alert(err);
        console.log(AWS.config.credentials);
    });

    var bucketName = 'your-bucket'; // Enter your bucket name
    var bucket = new AWS.S3({
        params: {
            Bucket: bucketName
        }
    });

    var fileChooser = document.getElementById('file-chooser');
    var button = document.getElementById('upload-button');
    var results = document.getElementById('results');
    button.addEventListener('click', function() {

        var file = fileChooser.files[0];

        if (file) {

            results.innerHTML = '';
            var objKey = 'testing/' + file.name;
            var params = {
                Key: objKey,
                ContentType: file.type,
                Body: file,
                ACL: 'public-read'
            };

            bucket.putObject(params, function(err, data) {
                if (err) {
                    results.innerHTML = 'ERROR: ' + err;
                } else {
                    listObjs();
                }
            });
        } else {
            results.innerHTML = 'Nothing to upload.';
        }
    }, false);
    function listObjs() {
        var prefix = 'testing';
        bucket.listObjects({
            Prefix: prefix
        }, function(err, data) {
            if (err) {
                results.innerHTML = 'ERROR: ' + err;
            } else {
                var objKeys = "";
                data.Contents.forEach(function(obj) {
                    objKeys += obj.Key + "<br>";
                });
                results.innerHTML = objKeys;
            }
        });
    }
    </script>
</body>

</html>

আরও তথ্যের জন্য, দয়া করে পরীক্ষা করুন - গিথুব

এটি কি একাধিক চিত্রকে সমর্থন করে?
ব্যবহারকারী 2722667

@ ব্যবহারকারী 2722667 হ্যাঁ এটি করে।
জুমলার

@ জুমলার হাই হ্যালো ধন্যবাদ তবে আমি ফায়ারফক্স রিকোয়েস্টের সময় এই সমস্যার মুখোমুখি হয়েছি সার্ভারের সাথে আপনার সকেট সংযোগটি সময়সীমার মধ্যে পড়েনি বা লিখিত হয়নি read নিষ্ক্রিয় সংযোগগুলি বন্ধ হয়ে যাবে এবং ফাইলটি এস 3 এ আপলোড হবে না you আপনি কীভাবে এই
সমস্যাটি

1
@ ইউসামা আপনি কি দয়া করে গিথুবে সমস্যাটি খুলতে পারেন কারণ বিষয়টি আমার কাছে পরিষ্কার নয়
জুমলার

@ জুমলার দেরিতে জবাবের জন্য দুঃখিত এখানে আমি গিটহাবের একটি সমস্যা খুলেছি দয়া করে এই ধন্যবাদটি একবার দেখুন। github.com/aws/aws-sdk-php/issues/1332
usama

16

আপনি বলছেন যে আপনি একটি "সার্ভারলেস" সমাধান চান। তবে এর অর্থ আপনার কাছে কোনও "আপনার" কোড লুপে রাখার ক্ষমতা নেই। (দ্রষ্টব্য: একবার আপনি কোনও ক্লায়েন্টকে আপনার কোডটি দিলে, এটি এখন "তাদের" কোড।) সিওআরএস লক ডাউন করা কোনও সাহায্য করবে না: লোকেরা সহজেই একটি ওয়েব-ভিত্তিক সরঞ্জাম (বা একটি ওয়েব-ভিত্তিক প্রক্সি) লিখতে পারে যা যুক্ত করে আপনার সিস্টেমের অপব্যবহারের জন্য সঠিক সিওআরএস শিরোনাম।

বড় সমস্যাটি হ'ল আপনি বিভিন্ন ব্যবহারকারীর মধ্যে পার্থক্য করতে পারবেন না। আপনি কোনও ব্যবহারকারীকে তার ফাইলগুলি তালিকা / অ্যাক্সেসের অনুমতি দিতে পারবেন না, তবে অন্যকে তা করতে বাধা দিন। আপনি যদি অপব্যবহার শনাক্ত করেন তবে কীটি পরিবর্তন করা ছাড়া এটি সম্পর্কে আপনি কিছুই করতে পারবেন না। (যা আক্রমণকারী সম্ভবত পুনরায় পেতে পারে))

আপনার জাভাস্ক্রিপ্ট ক্লায়েন্টের জন্য একটি কী সহ একটি "আইএএম ব্যবহারকারী" তৈরি করা আপনার সেরা বেট। এটি কেবল একটি বালতিতে লেখার অ্যাক্সেস দিন। (তবে আদর্শভাবে, তালিকাবাকেট অপারেশন সক্ষম করবেন না, এটি আক্রমণকারীদের কাছে আরও আকর্ষণীয় করে তুলবে))

আপনার যদি কোনও সার্ভার থাকে (20 ডলার / মাসে এমনকি সাধারণ মাইক্রো উদাহরণ), আপনি রিয়েলটাইমগুলিতে নিরীক্ষণ / অপব্যবহার রোধ করার সময় আপনার সার্ভারের কীগুলিতে স্বাক্ষর করতে পারেন। সার্ভার ব্যতীত, আপনি যা করতে পারেন তা হ'ল ঘটনা-পরে আপত্তিজনক সময়ে পর্যবেক্ষণ করা। আমি এখানে কি করব:

1) পর্যায়ক্রমে সেই আইএএম ব্যবহারকারীর জন্য কীগুলি ঘোরান: প্রতি রাতে, সেই আইএএম ব্যবহারকারীর জন্য একটি নতুন কী তৈরি করুন এবং সবচেয়ে পুরানো কীটি প্রতিস্থাপন করুন। যেহেতু 2 কী রয়েছে তাই প্রতিটি কী 2 দিনের জন্য বৈধ হবে।

2) এস 3 লগিং সক্ষম করুন এবং প্রতি ঘন্টা লগগুলি ডাউনলোড করুন। "অনেকগুলি আপলোড" এবং "অনেকগুলি ডাউনলোড" এ সতর্কতা সেট করুন। আপনি মোট ফাইলের আকার এবং আপলোড হওয়া ফাইলের সংখ্যা উভয়ই দেখতে চান। এবং আপনি উভয় গ্লোবাল योगফল, এবং প্রতি-আইপি ঠিকানা মোটও (একটি নীচের প্রান্ত সহ) নিরীক্ষণ করতে চান।

এই চেকগুলি "সার্ভারলেস" করা যায় কারণ আপনি এগুলি আপনার ডেস্কটপে চালাতে পারেন। (অর্থাত্ S3 সমস্ত কাজ করে, এই প্রক্রিয়াগুলি কেবলমাত্র আপনার এস 3 বালতির অপব্যবহার সম্পর্কে সতর্ক করার জন্য যাতে আপনি মাসের শেষে কোনও বিশাল অ্যাডাব্লুএস বিল পান না))


3
ম্যান, আমি ভুলে গিয়েছিলাম ল্যাম্বদার আগে জিনিসগুলি কত জটিল ছিল।
রায়ান শিলিংটন

10

গৃহীত উত্তরে আরও তথ্য যুক্ত করা, আপনি কোডটি একটি চলমান সংস্করণ দেখতে AWS স্বাক্ষর সংস্করণ 4 ব্যবহার করে আমার ব্লগটি উল্লেখ করতে পারেন refer

এখানে সংক্ষিপ্তসার হবে:

ব্যবহারকারী আপলোড করার জন্য একটি ফাইল বাছাই করার সাথে সাথে নিম্নলিখিতগুলি করুন: ১. প্রয়োজনীয় প্যারাম তৈরি করার জন্য কোনও পরিষেবা শুরু করার জন্য ওয়েব সার্ভারে একটি কল করুন

  1. এই পরিষেবাদিতে অস্থায়ী ক্রেডিট পেতে AWS আইএএম পরিষেবাতে কল করুন

  2. আপনার একবার ক্রেডিট হয়ে গেলে, বালতি নীতি তৈরি করুন (বেস 64 এনকোড স্ট্রিং)। তারপরে চূড়ান্ত স্বাক্ষর তৈরি করতে অস্থায়ী গোপন অ্যাক্সেস কী দিয়ে বালতি নীতিতে স্বাক্ষর করুন

  3. প্রয়োজনীয় প্যারামিটারগুলি ইউআইতে ফেরত পাঠান

  4. এটি প্রাপ্ত হওয়ার পরে, এইচটিএমএল ফর্ম অবজেক্ট তৈরি করুন, প্রয়োজনীয় প্যারামগুলি সেট করুন এবং এটি পোস্ট করুন।

বিস্তারিত তথ্যের জন্য, দয়া করে https://wordpress1763.wordpress.com/2016/10/03/browser-based-upload-aws-signature-version-4/ দেখুন


5
আমি জাভাস্ক্রিপ্টে এটি বের করার চেষ্টা করে একটি পুরো দিন ব্যয় করেছি এবং এই উত্তরটি XMLhttprequest ব্যবহার করে এটি কীভাবে করতে হবে তা আমাকে বলে দেয়। আমি খুব অবাক হয়েছি আপনি নিচু হয়ে গেছেন। ওপি জাভাস্ক্রিপ্ট চেয়েছিল এবং প্রস্তাবিত উত্তরে ফর্ম পেয়েছে। শুভ দুঃখ। এই উত্তরের জন্য ধন্যবাদ!
পল এস

বিটিডাব্লু হাইপারজেন্টের গুরুতর কর্স সমস্যা রয়েছে, তাই এক্সএমএলটি এইচটিপিআরএকটি এখনই এটি করার একমাত্র যুক্তিসঙ্গত উপায় বলে মনে হচ্ছে
পল এস

4

একটি স্বাক্ষর তৈরি করতে, আমার অবশ্যই আমার গোপন কীটি ব্যবহার করতে হবে। তবে সমস্ত কিছু ক্লায়েন্টের পক্ষেই ঘটে, সুতরাং, গোপন কীটি পৃষ্ঠার উত্স থেকে সহজেই প্রকাশ করা যায় (যদিও আমি আমার উত্সগুলিকে অবহেলা / এনক্রিপ্ট করি)।

এখানেই আপনি ভুল বুঝে গেছেন। ডিজিটাল স্বাক্ষর ব্যবহার করার খুব কারণটি হ'ল আপনি নিজের গোপন কীটি প্রকাশ না করেই কোনও কিছু সঠিক হিসাবে যাচাই করতে পারেন। এক্ষেত্রে আপনি ফর্ম পোস্টের জন্য যে নীতিটি সেট করেছেন তা পরিবর্তন করতে বাধা দিতে ডিজিটাল স্বাক্ষর ব্যবহার করা হয়।

ডিজিটাল স্বাক্ষর যেমন এখানে একটি ওয়েব জুড়ে সুরক্ষার জন্য ব্যবহৃত হয়। যদি কেউ (এনএসএ?) সত্যিই সেগুলি ভাঙ্গতে সক্ষম হয় তবে তাদের আপনার এস 3 বালতির তুলনায় অনেক বড় লক্ষ্য থাকতে হবে :)


2
তবে একটি রোবট দ্রুত সীমাহীন ফাইলগুলি আপলোড করার চেষ্টা করতে পারে। আমি কি প্রতি বালতিতে সর্বোচ্চ ফাইলের নীতি সেট করতে পারি?
ডিজেল

3

আমি জাভাস্ক্রিপ্ট ব্রাউজার থেকে এডাব্লুএস এস 3 এ ফাইলগুলি আপলোড করতে এবং এস 3 বালতিতে সমস্ত ফাইল তালিকাভুক্ত করার জন্য একটি সাধারণ কোড দিয়েছি।

পদক্ষেপ:

  1. কীভাবে তৈরি করুন আইডেন্টিটিপুলআইডি তৈরি করতে হয় তা জানতে http://docs.aws.amazon.com/cognito/latest/developerguide/identity-pools.html

    1. গোটো এস 3 এর কনসোল পৃষ্ঠা এবং বালতি বৈশিষ্ট্য থেকে কর্স কনফিগারেশন খুলুন এবং এতে নিম্নলিখিত XML কোডটি লিখুন।

      <?xml version="1.0" encoding="UTF-8"?>
      <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
       <CORSRule>    
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedMethod>DELETE</AllowedMethod>
        <AllowedMethod>HEAD</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
       </CORSRule>
      </CORSConfiguration>
    2. নিম্নলিখিত কোডযুক্ত HTML ফাইল তৈরি করুন শংসাপত্রগুলি পরিবর্তন করুন, ব্রাউজারে ফাইল খুলুন এবং উপভোগ করুন।

      <script type="text/javascript">
       AWS.config.region = 'ap-north-1'; // Region
       AWS.config.credentials = new AWS.CognitoIdentityCredentials({
       IdentityPoolId: 'ap-north-1:*****-*****',
       });
       var bucket = new AWS.S3({
       params: {
       Bucket: 'MyBucket'
       }
       });
      
       var fileChooser = document.getElementById('file-chooser');
       var button = document.getElementById('upload-button');
       var results = document.getElementById('results');
      
       function upload() {
       var file = fileChooser.files[0];
       console.log(file.name);
      
       if (file) {
       results.innerHTML = '';
       var params = {
       Key: n + '.pdf',
       ContentType: file.type,
       Body: file
       };
       bucket.upload(params, function(err, data) {
       results.innerHTML = err ? 'ERROR!' : 'UPLOADED.';
       });
       } else {
       results.innerHTML = 'Nothing to upload.';
       }    }
      </script>
      <body>
       <input type="file" id="file-chooser" />
       <input type="button" onclick="upload()" value="Upload to S3">
       <div id="results"></div>
      </body>

2
কেউ আমার এস আই বালতিতে ফাইল আপলোড করার জন্য আমার "আইডেন্টিপুলিআইডি" ব্যবহার করতে সক্ষম হবে না? এই সমাধানটি কীভাবে কোনও তৃতীয় পক্ষকে কেবল আমার "আইডেন্টিপুলআইডি" অনুলিপি করা এবং আমার এস 3 বালতিতে প্রচুর ফাইল আপলোড করা থেকে বাধা দিচ্ছে?
সাহিল

1
stackoverflow.com/users/4535741/sahil আপনি অন্যান্য ডোমেন থেকে ডেটা / ফাইল আপলোডকে এস সি বালতিতে উপযুক্ত সিওআরএস সেটিংস সেট করে প্রতিরোধ করতে পারেন। এমনকি যদি কেউ আপনার পরিচয় পুল আইডি অ্যাক্সেস করে তবে তারা আপনার এস 3 বালতি ফাইলগুলি চালিত করতে পারে না।
নিলেশ পাওয়ার

2

আপনার যদি কোনও সার্ভার সাইড কোড না থাকে তবে আপনার সুরক্ষা ক্লায়েন্টের পক্ষে আপনার জাভাস্ক্রিপ্ট কোড অ্যাক্সেসের সুরক্ষার উপর নির্ভর করে (যেমন কোড রয়েছে এমন প্রত্যেকে কিছু আপলোড করতে পারে)।

সুতরাং আমি সুপারিশ করব, কেবলমাত্র একটি বিশেষ এস 3 বালতি তৈরি করতে যা পাবলিক লিখনযোগ্য (তবে পাঠযোগ্য নয়), যাতে আপনার ক্লায়েন্ট পক্ষের কোনও স্বাক্ষরযুক্ত উপাদানগুলির প্রয়োজন হবে না।

বালতি নাম (একটি জিইউইডি উদাঃ) দূষিত আপলোডগুলির বিরুদ্ধে আপনার একমাত্র প্রতিরক্ষা হবে (তবে কোনও সম্ভাব্য আক্রমণকারী ডেটা স্থানান্তর করতে আপনার বালতিটি ব্যবহার করতে পারেনি, কারণ এটি কেবল তাঁর কাছে লেখা)


1

আপনি নোড এবং সার্ভারলেস ব্যবহার করে কীভাবে কোনও নীতি দলিল তৈরি করেন তা এখানে

"use strict";

const uniqid = require('uniqid');
const crypto = require('crypto');

class Token {

    /**
     * @param {Object} config SSM Parameter store JSON config
     */
    constructor(config) {

        // Ensure some required properties are set in the SSM configuration object
        this.constructor._validateConfig(config);

        this.region = config.region; // AWS region e.g. us-west-2
        this.bucket = config.bucket; // Bucket name only
        this.bucketAcl = config.bucketAcl; // Bucket access policy [private, public-read]
        this.accessKey = config.accessKey; // Access key
        this.secretKey = config.secretKey; // Access key secret

        // Create a really unique videoKey, with folder prefix
        this.key = uniqid() + uniqid.process();

        // The policy requires the date to be this format e.g. 20181109
        const date = new Date().toISOString();
        this.dateString = date.substr(0, 4) + date.substr(5, 2) + date.substr(8, 2);

        // The number of minutes the policy will need to be used by before it expires
        this.policyExpireMinutes = 15;

        // HMAC encryption algorithm used to encrypt everything in the request
        this.encryptionAlgorithm = 'sha256';

        // Client uses encryption algorithm key while making request to S3
        this.clientEncryptionAlgorithm = 'AWS4-HMAC-SHA256';
    }

    /**
     * Returns the parameters that FE will use to directly upload to s3
     *
     * @returns {Object}
     */
    getS3FormParameters() {
        const credentialPath = this._amazonCredentialPath();
        const policy = this._s3UploadPolicy(credentialPath);
        const policyBase64 = new Buffer(JSON.stringify(policy)).toString('base64');
        const signature = this._s3UploadSignature(policyBase64);

        return {
            'key': this.key,
            'acl': this.bucketAcl,
            'success_action_status': '201',
            'policy': policyBase64,
            'endpoint': "https://" + this.bucket + ".s3-accelerate.amazonaws.com",
            'x-amz-algorithm': this.clientEncryptionAlgorithm,
            'x-amz-credential': credentialPath,
            'x-amz-date': this.dateString + 'T000000Z',
            'x-amz-signature': signature
        }
    }

    /**
     * Ensure all required properties are set in SSM Parameter Store Config
     *
     * @param {Object} config
     * @private
     */
    static _validateConfig(config) {
        if (!config.hasOwnProperty('bucket')) {
            throw "'bucket' is required in SSM Parameter Store Config";
        }
        if (!config.hasOwnProperty('region')) {
            throw "'region' is required in SSM Parameter Store Config";
        }
        if (!config.hasOwnProperty('accessKey')) {
            throw "'accessKey' is required in SSM Parameter Store Config";
        }
        if (!config.hasOwnProperty('secretKey')) {
            throw "'secretKey' is required in SSM Parameter Store Config";
        }
    }

    /**
     * Create a special string called a credentials path used in constructing an upload policy
     *
     * @returns {String}
     * @private
     */
    _amazonCredentialPath() {
        return this.accessKey + '/' + this.dateString + '/' + this.region + '/s3/aws4_request';
    }

    /**
     * Create an upload policy
     *
     * @param {String} credentialPath
     *
     * @returns {{expiration: string, conditions: *[]}}
     * @private
     */
    _s3UploadPolicy(credentialPath) {
        return {
            expiration: this._getPolicyExpirationISODate(),
            conditions: [
                {bucket: this.bucket},
                {key: this.key},
                {acl: this.bucketAcl},
                {success_action_status: "201"},
                {'x-amz-algorithm': 'AWS4-HMAC-SHA256'},
                {'x-amz-credential': credentialPath},
                {'x-amz-date': this.dateString + 'T000000Z'}
            ],
        }
    }

    /**
     * ISO formatted date string of when the policy will expire
     *
     * @returns {String}
     * @private
     */
    _getPolicyExpirationISODate() {
        return new Date((new Date).getTime() + (this.policyExpireMinutes * 60 * 1000)).toISOString();
    }

    /**
     * HMAC encode a string by a given key
     *
     * @param {String} key
     * @param {String} string
     *
     * @returns {String}
     * @private
     */
    _encryptHmac(key, string) {
        const hmac = crypto.createHmac(
            this.encryptionAlgorithm, key
        );
        hmac.end(string);

        return hmac.read();
    }

    /**
     * Create an upload signature from provided params
     * https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html#signing-request-intro
     *
     * @param policyBase64
     *
     * @returns {String}
     * @private
     */
    _s3UploadSignature(policyBase64) {
        const dateKey = this._encryptHmac('AWS4' + this.secretKey, this.dateString);
        const dateRegionKey = this._encryptHmac(dateKey, this.region);
        const dateRegionServiceKey = this._encryptHmac(dateRegionKey, 's3');
        const signingKey = this._encryptHmac(dateRegionServiceKey, 'aws4_request');

        return this._encryptHmac(signingKey, policyBase64).toString('hex');
    }
}

module.exports = Token;

ব্যবহৃত কনফিগারেশন অবজেক্টটি এসএসএম প্যারামিটার স্টোরে সংরক্ষিত এবং এর মতো দেখতে

{
    "bucket": "my-bucket-name",
    "region": "us-west-2",
    "bucketAcl": "private",
    "accessKey": "MY_ACCESS_KEY",
    "secretKey": "MY_SECRET_ACCESS_KEY",
}

0

আপনি যদি তৃতীয় পক্ষের পরিষেবাটি ব্যবহার করতে ইচ্ছুক থাকেন তবে auth0.com এই সংহতিকে সমর্থন করে। Auth0 পরিষেবা কোনও AWS অস্থায়ী সেশন টোকেনের জন্য একটি তৃতীয় পক্ষের এসএসও পরিষেবা প্রমাণীকরণের বিনিময়ে অনুমতিগুলিকে সীমিত করে দেবে।

দেখুন: https://github.com/auth0-sample/auth0-s3-sample/
এবং auth0 ডকুমেন্টেশন।


1
যেমনটি আমি বুঝতে পেরেছি - এখন আমাদের জন্য কগনিটো আছে?
ভাইটালি জেডনেভিচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.