JWT ভিত্তিক প্রমাণীকরণের সাথে ফাইল ডাউনলোডগুলি কীভাবে পরিচালনা করবেন?


116

আমি কৌণিকালে একটি ওয়েব অ্যাপ লিখছি যেখানে প্রমাণীকরণ একটি জেডাব্লুটি টোকেন দ্বারা পরিচালিত হয়, অর্থাত প্রতিটি অনুরোধে সমস্ত প্রয়োজনীয় তথ্য সহ একটি "প্রমাণীকরণ" শিরোনাম থাকে।

এটি আরএসটি কলগুলির জন্য দুর্দান্তভাবে কাজ করে, তবে আমি বুঝতে পারি না যে কিভাবে ব্যাকএন্ডে হোস্ট করা ফাইলগুলির জন্য ডাউনলোড লিঙ্কগুলি হ্যান্ডেল করা উচিত (ফাইলগুলি একই সার্ভারে থাকে যেখানে ওয়েবসার্চগুলি হোস্ট করা হয়)।

আমি নিয়মিত <a href='...'/>লিঙ্কগুলি ব্যবহার করতে পারি না কারণ তারা কোনও শিরোনাম বহন করে না এবং প্রমাণীকরণ ব্যর্থ হয়। বিভিন্ন incantation একই window.open(...)

কিছু সমাধান যা আমি ভেবেছিলাম:

  1. সার্ভারে একটি অস্থায়ী সুরক্ষিত ডাউনলোড লিঙ্ক তৈরি করুন
  2. প্রমাণীকরণের তথ্যটি একটি url প্যারামিটার হিসাবে পাস করুন এবং ম্যানুয়ালি কেসটি হ্যান্ডেল করুন
  3. এক্সএইচআর এর মাধ্যমে ডেটা পান এবং ফাইল ক্লায়েন্টের পাশে সংরক্ষণ করুন।

উপরের সমস্তটি সন্তোষজনক চেয়ে কম।

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

2 কমপক্ষে কাজ হিসাবে মনে হয়।

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

এই টাস্কটি যদিও বেশ বেসিক বলে মনে হচ্ছে তাই আমি ভাবছি যে আমি ব্যবহার করতে পারার মতো আরও সহজ কিছু আছে কিনা।

আমি অগত্যা একটি সমাধান "কৌণিক উপায়" খুঁজছি না। নিয়মিত জাভাস্ক্রিপ্ট ঠিক আছে।


দূরবর্তী দ্বারা আপনি কি বোঝাতে চেয়েছেন যে ডাউনলোডযোগ্য ফাইলগুলি অ্যাংুলার অ্যাপ্লিকেশনটির চেয়ে আলাদা ডোমেনে আছে? আপনি কি রিমোটটি নিয়ন্ত্রণ করেন (এটির ব্যাকএন্ডটি সংশোধন করার অ্যাক্সেস রয়েছে) বা না?
Robertjd

আমি বোঝাতে চাইছি যে ফাইলের ডেটা ক্লায়েন্টে নেই (ব্রাউজার); ফাইলটি একই ডোমেনে হোস্ট করা হয় এবং আমার ব্যাকএন্ডের নিয়ন্ত্রণ থাকে। প্রশ্নটি কম দ্বিধাগ্রস্থ করতে আমি আপডেট করব।
মার্কো রিঘলে

বিকল্প 2 এর অসুবিধা আপনার ব্যাকএন্ডের উপর নির্ভরশীল। আপনি যদি আপনার ব্যাকএন্ডকে জেআরডাব্লুটিটির অনুমোদনের স্তরটি অনুমোদনের স্তরটি দিয়ে যায় তার পরেও কোয়েরি স্ট্রিংটি চেক করতে বলতে পারেন, আপনি হয়ে গেছেন। আপনি কোন ব্যাকএন্ড ব্যবহার করছেন?
টেকনেটিয়াম

উত্তর:


47

ডাউনলোড বৈশিষ্ট্যাবলী , ফেচ এপিআই এবং ইউআরএল.আরসিআরএবজেক্ট URL ব্যবহার করে ক্লায়েন্টে এটি ডাউনলোড করার একটি উপায় এখানে । আপনি আপনার জেডাব্লুটিটি ব্যবহার করে ফাইলটি আনবেন, পে-লোডকে একটি ব্লাবে রূপান্তরিত করবেন, ব্লবকে কোনও অবজেক্টে ইউআরএল-এ স্থাপন করবেন, অ্যাঙ্করএল URL এ অ্যাঙ্কর ট্যাগের উত্স নির্ধারণ করবেন এবং জাভাস্ক্রিপ্টে সেই অবজেক্ট URL ক্লিক করুন।

let anchor = document.createElement("a");
document.body.appendChild(anchor);
let file = 'https://www.example.com/some-file.pdf';

let headers = new Headers();
headers.append('Authorization', 'Bearer MY-TOKEN');

fetch(file, { headers })
    .then(response => response.blob())
    .then(blobby => {
        let objectUrl = window.URL.createObjectURL(blobby);

        anchor.href = objectUrl;
        anchor.download = 'some-file.pdf';
        anchor.click();

        window.URL.revokeObjectURL(objectUrl);
    });

downloadবৈশিষ্ট্যের মানটি হবে শেষ ফাইলের নাম। যদি ইচ্ছা হয়, তবে আপনি অন্যান্য উত্তরে বর্ণিত হিসাবে বিষয়বস্তু স্বভাবের প্রতিক্রিয়া শিরোনামের বাইরে একটি উদ্দেশ্যযুক্ত ফাইলের নামটি খনি করতে পারেন ।


1
আমি কেন ভাবছি কেন কেউ এই প্রতিক্রিয়া বিবেচনা করে না। এটি সহজ এবং আমরা যেহেতু 2017 সালে বাস করছি, প্ল্যাটফর্ম সমর্থন মোটামুটি ভাল।
রাফাল পস্তুজ্জাক

1
তবে ডাউনলোড বৈশিষ্ট্যের জন্য আইওএসফারি সমর্থন দেখতে বেশ লাল দেখাচ্ছে :(
মার্টিন ক্রেমার

1
এটি ক্রোমে আমার পক্ষে ভাল কাজ করেছে। ফায়ারফক্সের জন্য এটি ডকুমেন্টটিতে অ্যাঙ্কর যুক্ত করার পরে কাজ করেছিল: ডকুমেন্ট.বডি.এপেন্ডচিল্ড (অ্যাঙ্কর);
এজটির

12
এই সমাধানটি কাজ করে তবে কি এই সমাধানটি বড় ফাইলগুলির সাথে ইউএক্স উদ্বেগগুলি পরিচালনা করে? যদি আমাকে মাঝে মাঝে 300MB ফাইল ডাউনলোড করতে হয় তবে লিঙ্কটি ক্লিক করার আগে এবং ব্রাউনারের ডাউনলোড ম্যানেজারকে প্রেরণের আগে ডাউনলোড করতে কিছুটা সময় নিতে পারে। আনতে-প্রগতি এপিআই ব্যবহার করে আমরা প্রচেষ্টাটি ব্যয় করতে পারি এবং আমাদের নিজস্ব ডাউনলোডের অগ্রগতি ইউআই তৈরি করতে পারি .. তবে তারপরে এটি ডাউনলোডের হাতে সরিয়ে দেওয়ার জন্য 300 এমবি ফাইল জেএস-ল্যান্ডে (স্মৃতিতে?) লোড করার সন্দেহজনক অনুশীলনও রয়েছে there's ম্যানেজার।
scvnc

1
@ টম্পি আমিও এজ ও আইই এর জন্য এই কাজটি করতে পারিনি
zappa

34

প্রযুক্তি

জে ডাব্লুটি টি সুপরিচিত প্রচারক আথ0 এর মাটিয়াস ওলোসকির এই পরামর্শের ভিত্তিতে আমি হক এর সাথে স্বাক্ষরিত অনুরোধ উত্পন্ন করে এটি সমাধান করেছি ।

উলোসকি উদ্ধৃত:

আপনি যেভাবে সমাধান করছেন সেটি হ'ল এডাব্লুএসের মতো একটি স্বাক্ষরিত অনুরোধ উত্পন্ন করে উদাহরণস্বরূপ।

অ্যাক্টিভেশন লিঙ্কগুলির জন্য ব্যবহৃত এই কৌশলটির একটি উদাহরণ এখানে রয়েছে

ব্যাকএন্ড

আমি আমার ডাউনলোড ইউআরএল সাইন করতে একটি এপিআই তৈরি করেছি:

অনুরোধ:

POST /api/sign
Content-Type: application/json
Authorization: Bearer...
{"url": "https://path.to/protected.file"}

প্রতিক্রিয়া:

{"url": "https://path.to/protected.file?bewit=NTUzMDYzZTQ2NDYxNzQwMGFlMDMwMDAwXDE0NTU2MzU5OThcZDBIeEplRHJLVVFRWTY0OWFFZUVEaGpMOWJlVTk2czA0cmN6UU4zZndTOD1c"}

একটি স্বাক্ষরিত ইউআরএল দিয়ে, আমরা ফাইলটি পেতে পারি

অনুরোধ:

GET https://path.to/protected.file?bewit=NTUzMDYzZTQ2NDYxNzQwMGFlMDMwMDAwXDE0NTU2MzU5OThcZDBIeEplRHJLVVFRWTY0OWFFZUVEaGpMOWJlVTk2czA0cmN6UU4zZndTOD1c

প্রতিক্রিয়া:

Content-Type: multipart/mixed; charset="UTF-8"
Content-Disposition': attachment; filename=protected.file
{BLOB}

সম্মুখভাগ ( জোজয়ুজি দ্বারা )

এইভাবে আপনি একক ব্যবহারকারীর ক্লিক এ সব করতে পারেন:

function clickedOnDownloadButton() {

  postToSignWithAuthorizationHeader({
    url: 'https://path.to/protected.file'
  }).then(function(signed) {
    window.location = signed.url;
  });

}

2
এটি দুর্দান্ত তবে ওপি'র অপশন # 2 (ক্যোয়ারী স্ট্রিং প্যারামিটার হিসাবে টোকেন) এর চেয়ে সুরক্ষা দৃষ্টিকোণ থেকে এটি কীভাবে আলাদা তা আমি বুঝতে পারি না। প্রকৃতপক্ষে, আমি কল্পনা করতে পারি যে স্বাক্ষরিত অনুরোধটি আরও বিধিনিষেধযুক্ত হতে পারে, যেমন কেবলমাত্র একটি নির্দিষ্ট শেষ পয়েন্টে অ্যাক্সেসের অনুমতি দেওয়া হয়েছে। তবে ওপি'র # 2 সহজে / কম পদক্ষেপ বলে মনে হচ্ছে, এতে কী দোষ আছে?
টাইলার কলিয়ার

4
আপনার ওয়েব সার্ভারের উপর নির্ভর করে সম্পূর্ণ ইউআরএল এর লগ ফাইলগুলিতে লগ হতে পারে। আপনার আইটি লোকেরা সমস্ত টোকেনে অ্যাক্সেস পেয়ে থাকতে পারে না।
এজেকিয়াস ডেনেলা

2
অতিরিক্তভাবে ক্যোয়ারী স্ট্রিং সহ ইউআরএল আপনার ব্যবহারকারীর ইতিহাসে সংরক্ষণ করা হবে, একই মেশিনের অন্যান্য ব্যবহারকারীদের ইউআরএল অ্যাক্সেস করার অনুমতি দেয়।
এজেকিয়াস ডেনেলা

1
অবশেষে এবং কী এটি একেবারেই সুরক্ষিত করে তোলে তা হল URL টি কোনও সংস্থান, এমনকি তৃতীয় পক্ষের সংস্থানগুলির জন্য সমস্ত অনুরোধের রেফার শিরোনামে প্রেরণ করা হয়। সুতরাং আপনি যদি গুগল অ্যানালিটিক্স উদাহরণস্বরূপ ব্যবহার করে থাকেন তবে আপনি গুগলকে ইউআরএল টোক ইন এবং তাদের সকলকে পাঠিয়ে দেবেন।
এজেকিয়াস ডেনেলা

1
এই টেক্সট এখানে থেকে নিয়ে যাওয়া হয় stackoverflow.com/questions/643355/...
Ezequias Dinella

10

ইতিমধ্যে উল্লিখিত বিদ্যমান "ফেচ / ক্রিয়েওবজেক্ট URL" এবং "ডাউনলোড-টোকেন" পদ্ধতির বিকল্প একটি স্ট্যান্ডার্ড ফর্ম পোষ্ট যা একটি নতুন উইন্ডোকে লক্ষ্য করে । ব্রাউজারটি সার্ভারের প্রতিক্রিয়ায় সংযুক্তি শিরোনামটি একবার পড়লে এটি নতুন ট্যাবটি বন্ধ করে ডাউনলোড শুরু করবে। এই একই পদ্ধতির কোনও নতুন ট্যাবে পিডিএফ এর মতো সংস্থান প্রদর্শন করার জন্য সুন্দরভাবে কাজ করার জন্যও ঘটে।

এটিতে পুরানো ব্রাউজারগুলির জন্য আরও ভাল সমর্থন রয়েছে এবং নতুন ধরণের টোকেন পরিচালনা করা এড়ানো যায়। ইউআরএলটিতে বুনিয়াদি লেখকের তুলনায় এটির দীর্ঘমেয়াদী সমর্থনও থাকবে, যেহেতু ইউআরএলটিতে ব্যবহারকারী নাম / পাসওয়ার্ডের জন্য সমর্থন ব্রাউজারগুলি দ্বারা সরানো হচ্ছে

উপর ক্লায়েন্ট-সাইড আমরা ব্যবহার target="_blank"এমনকি ব্যর্থতা ক্ষেত্রে, যা spas (একক পৃষ্ঠার অ্যাপ্লিকেশানগুলি) জন্য বিশেষভাবে গুরুত্বপূর্ণ মধ্যে এড়ানোর নেভিগেশনে।

প্রধান সতর্কীকরণ যে সার্ভার সাইড JWT বৈধতা থেকে টোকেন পাওয়ার জন্য রয়েছে পোস্ট তথ্য এবং হেডার থেকে নয় । যদি আপনার ফ্রেমওয়ার্কটি প্রমাণীকরণ শিরোনাম ব্যবহার করে স্বয়ংক্রিয়ভাবে রুট হ্যান্ডলারগুলিতে অ্যাক্সেস পরিচালনা করে তবে আপনার হ্যান্ডলারটি অচিহ্নিত / বেনাম হিসাবে চিহ্নিত করতে হবে যাতে আপনি যথাযথ অনুমোদনের বিষয়টি নিশ্চিত করতে JWT কে ম্যানুয়ালি বৈধ করতে পারেন।

ফর্মটি গতিশীলভাবে তৈরি এবং অবিলম্বে ধ্বংস করা যেতে পারে যাতে এটি সঠিকভাবে পরিষ্কার করা হয় (দ্রষ্টব্য: এটি সাধারণ জেএসে করা যেতে পারে, তবে জিকুয়েরি এখানে স্পষ্টতার জন্য ব্যবহৃত হয়) -

function DownloadWithJwtViaFormPost(url, id, token) {
    var jwtInput = $('<input type="hidden" name="jwtToken">').val(token);
    var idInput = $('<input type="hidden" name="id">').val(id);
    $('<form method="post" target="_blank"></form>')
                .attr("action", url)
                .append(jwtInput)
                .append(idInput)
                .appendTo('body')
                .submit()
                .remove();
}

লুকানো ইনপুট হিসাবে আপনার জমা দেওয়ার জন্য যে কোনও অতিরিক্ত ডেটা যুক্ত করতে হবে এবং সেগুলি ফর্মে যুক্ত হয়েছে তা নিশ্চিত করুন।


1
আমি বিশ্বাস করি যে এই সমাধানটি ব্যাপকভাবে অবমূল্যায়িত। এটি সহজ, পরিষ্কার এবং পুরোপুরি কাজ করে।
ইউরা ফেদরিভ

6

আমি ডাউনলোডের জন্য টোকেন তৈরি করব।

কৌণিকর মধ্যে অস্থায়ী টোকেন পাওয়ার জন্য একটি প্রমাণীকরণ অনুরোধ করুন (এক ঘন্টা বলুন) তারপরে এটি প্যারা প্যারামিটার হিসাবে যুক্ত করুন। আপনি যেভাবে চান ফাইলগুলি ডাউনলোড করতে পারেন (উইন্ডো.পেন ...)


2
এই সমাধানটি আমি আপাতত ব্যবহার করছি, তবে আমি এতে সন্তুষ্ট নই কারণ এটি বেশ কাজ এবং আমি আশা করছি এর চেয়ে আরও ভাল সমাধান "সেখানে" পাওয়া যাবে ...
মার্কো রিগেল

3
আমি মনে করি এটি সবচেয়ে পরিষ্কার সমাধান উপলব্ধ এবং আমি সেখানে প্রচুর কাজ দেখতে পাচ্ছি না। তবে আমি হয় টোকেনের একটি ছোট মেয়াদী সময় বেছে নেব (উদাহরণস্বরূপ 3 মিনিট) বা সার্ভারে টোকেনের একটি তালিকা রেখে এটি ব্যবহার করে টোকেনগুলি মুছে ফেলুন (আমার তালিকায় নেই এমন টোকেন গ্রহণ না করে) )।
নবীনকা

5

একটি অতিরিক্ত সমাধান: মৌলিক প্রমাণীকরণ ব্যবহার করে। যদিও এটি ব্যাকএন্ডে কিছুটা কাজ প্রয়োজন, টোকেনগুলি লগগুলিতে দৃশ্যমান হবে না এবং কোনও ইউআরএল স্বাক্ষর কার্যকর করতে হবে না।


মক্কেলের পক্ষে

একটি উদাহরণ ইউআরএল হতে পারে:

http://jwt:<user jwt token>@some.url/file/35/download

ডামি টোকেন সহ উদাহরণ:

http://jwt:eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIwIiwibmFtZSI6IiIsImlhdCI6MH0.KsKmQOZM-jcy4l_7NFsv1lWfpH8ofniVCv75ZRQrWno@some.url/file/35/download

তারপরে আপনি এটিকে <a href="...">বা এড়াতে পারেন window.open("...")- ব্রাউজারটি বাকিটি পরিচালনা করে।


সার্ভার সাইড

এখানে বাস্তবায়ন আপনার উপর নির্ভর করে এবং এটি আপনার সার্ভার সেটআপের উপর নির্ভরশীল - এটি ?token=ক্যোয়ারী প্যারামিটার ব্যবহার করা থেকে খুব বেশি আলাদা নয় ।

লারাভেল ব্যবহার করে, আমি সহজ রুটে চলে গিয়েছি এবং Authorization: Bearer <...>সাধারণ প্রমাণীকরণের মিডলওয়্যারটিকে বাকী অংশটি হ্যান্ডেল করে দিয়ে প্রাথমিক প্রমাণীকরণের পাসওয়ার্ডটিকে JWT শিরোনামে রূপান্তরিত করেছি :

class CarryBasic
{
    /**
     * @param Request $request
     * @param \Closure $next
     * @return mixed
     */
    public function handle($request, \Closure $next)
    {
        // if no basic auth is passed,
        // or the user is not "jwt",
        // send a 401 and trigger the basic auth dialog
        if ($request->getUser() !== 'jwt') {
            return $this->failedBasicResponse();
        }

        // if there _is_ basic auth passed,
        // and the user is JWT,
        // shove the password into the "Authorization: Bearer <...>"
        // header and let the other middleware
        // handle it.
        $request->headers->set(
            'Authorization',
            'Bearer ' . $request->getPassword()
        );

        return $next($request);
    }

    /**
     * Get the response for basic authentication.
     *
     * @return void
     * @throws \Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException
     */
    protected function failedBasicResponse()
    {
        throw new UnauthorizedHttpException('Basic', 'Invalid credentials.');
    }
}

এই পদ্ধতির প্রতিশ্রুতিবদ্ধ বলে মনে হচ্ছে, তবে আমি JWT টোকেনে এইভাবে অ্যাক্সেস পাওয়ার কোনও উপায় দেখতে পাচ্ছি না। আপনি কি আমাকে কোনও সংস্থানটিতে নির্দেশ করতে পারেন যে সার্ভারটি কীভাবে এই অদ্ভুত ইউআরএলকে পার্স করে এবং কোথায় ডাব্লুডব্লিউটি টোকেন মান অ্যাক্সেস করতে পারে?
জিরি ভেটিস্কা

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