কীভাবে অপশন প্রিফলাইট অনুরোধটি এড়ানো যায়?


94

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

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

এই কোডটির বিষয়ে আমি কথা বলছি:

        var request = {
                language: 'fr',
                barcodes: [
                    {
                        barcode: 'somebarcode',
                        description: 'Description goes here'
                    }
                ]
            };
        }
        var config = {
            headers: { 
                'Cache-Control': 'no-cache',
                'Content-Type': 'application/json'
            }
        };
        $http.post('http://somedomain.be/trackinginfo', request, config).success(function(data, status) {
            callback(undefined, data);
        }).error(function(data, status) {
            var err = new Error('Error message');
            err.status = status;
            callback(err);
        });

আমি কীভাবে ব্রাউজারটিকে (বা অ্যাঙ্গুলার জেএস) সেই বিকল্পগুলির অনুরোধ পাঠানো থেকে বাধা দিতে পারি এবং কেবলমাত্র প্রকৃত পোস্টের অনুরোধটি এড়িয়ে যেতে পারি? আমি AngularJS 1.2.0 ব্যবহার করছি।

আগাম ধন্যবাদ.

উত্তর:


102

প্রিফলাইটটি আপনার সামগ্রী-প্রকারের দ্বারা ট্রিগার করা হচ্ছে application/json। এটি প্রতিরোধের সহজতম উপায় হ'ল text/plainআপনার ক্ষেত্রে বিষয়বস্তুর ধরণটি সেট করা । application/x-www-form-urlencoded& multipart/form-dataবিষয়বস্তুর প্রকারগুলিও গ্রহণযোগ্য, তবে অবশ্যই আপনার অনুরোধের পেওডকে যথাযথভাবে ফর্ম্যাট করতে হবে।

যদি আপনি এখনও এই পরিবর্তনটি করার পরে একটি প্রিফ্লাইটটি দেখছেন, তবে অ্যাঙ্গুলার অনুরোধটিতে একটি এক্স-শিরোনাম যুক্তও করতে পারে।

অথবা আপনার শিরোনাম থাকতে পারে (অনুমোদন, ক্যাশে-নিয়ন্ত্রণ ...) যা এটি ট্রিগার করবে, দেখুন:


9
এটি সঠিক উত্তর - আপনার সামগ্রী-প্রকার এবং ক্যাশে-নিয়ন্ত্রণ শিরোনাম একটি প্রিফলাইট অনুরোধ ট্রিগার করছে। পাঠ্য / প্লেইনের সামগ্রী-প্রকারের সাথে একটি সরল জিইটি হ'ল একটি অনিচ্ছাকৃত অনুরোধটি ট্রিগার করার একমাত্র উপায়। দেখুন: ডেভেলপার.মোজিলা.আর.ইন-
জেফ হাবার্ড

হ্যাঁ হ্যাঁ, ক্যাশে-নিয়ন্ত্রণ সম্পর্কে ভুলে গেছেন।
রে নিকোলাস

17
একটি কাস্টম হেডারও প্রিফলাইটটি ট্রিগার করবে।
সাবস্টিয়ান দেপ্রেজ

4
অপশন পরীক্ষা আটকাতে সামগ্রীর ধরণের পরিবর্তন করা উত্তর নয়। বিষয়বস্তু প্রকার নির্বিশেষে সামগ্রীর প্রকারের সাথে মিলিত হওয়া উচিত
ker

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

16

রায় যা বলেছিল, তেমন আপনি কন্টেন্ট-শিরোনামটি সংশোধন করে এটি বন্ধ করতে পারেন -

 $http.defaults.headers.post["Content-Type"] = "text/plain";

উদাহরণ স্বরূপ -

angular.module('myApp').factory('User', ['$resource','$http',
    function($resource,$http){
        $http.defaults.headers.post["Content-Type"] = "text/plain";
        return $resource(API_ENGINE_URL+'user/:userId', {}, {
            query: {method:'GET', params:{userId:'users'}, isArray:true},
            getLoggedIn:{method:'GET'}
        });
    }]);

বা সরাসরি একটি কল -

var req = {
 method: 'POST',
 url: 'http://example.com',
 headers: {
   'Content-Type': 'text/plain'
 },
 data: { test: 'test' }
}

$http(req).then(function(){...}, function(){...});

এটি কোনও প্রাক-বিমানের বিকল্পের অনুরোধ প্রেরণ করবে না।

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


4
আমি ঠিক কিভাবে এটি করা উচিত $http?
শিক্ষানবিশ

ধন্যবাদ, আমি যা করছিলাম তেমনই এটি। একমাত্র পরিবর্তনগুলি GETহ'ল পদ্ধতি এবং একটি অতিরিক্ত শিরোনাম Authorization। তবে এখনও প্রিফলাইট প্রেরণ করা হচ্ছে।
শিক্ষানবিশ

4
আপনি কি এখানে আপনার অনুরোধ পেস্ট করতে পারেন? কার্ল বা কিছু হিসাবে? অনুমোদনের শিরোনামের কারণে এটি হতে পারে, এটি সরিয়ে চেষ্টা করুন এবং তারপরে চেষ্টা করুন। আপনি যদি কাস্টম শিরোনাম প্রেরণ করছেন তবে কৌণিক প্রি-ফ্লাইটের অনুরোধ পাঠাবে।
ভিভেক্স


2

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

$http.get( ‘https://example.com/api/v1/users/’ +userId,
  {params:{
           apiKey:’34d1e55e4b02e56a67b0b66’
          }
  } 
);

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

Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: accept, origin, x-requested-with, content-type
Access-Control-Allow-Methods: DELETE
Access-Control-Allow-Methods: OPTIONS
Access-Control-Allow-Methods: PUT
Access-Control-Allow-Methods: GET
Access-Control-Allow-Methods: POST
Access-Control-Allow-Orgin: *
Access-Control-Max-Age: 172800
Allow: PUT
Allow: OPTIONS
Allow: POST
Allow: DELETE
Allow: GET

2

আমি মনে করি যে মধ্যম ওয়্যার থেকে অনুরোধটি "অপশন" রিটার্ন 200 টাইপ করে কিনা সেরা উপায় তা পরীক্ষা করা উচিত। এটা আমার জন্য কাজ করেছে।

express.use('*',(req,res,next) =>{
      if (req.method == "OPTIONS") {
        res.status(200);
        res.send();
      }else{
        next();
      }
    });

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

0

প্রিফলাইট ব্রাউজার দ্বারা প্রয়োগ করা একটি ওয়েব সুরক্ষা বৈশিষ্ট্য। ক্রোমের জন্য আপনি - অক্ষম-ওয়েব-সুরক্ষা পতাকা যুক্ত করে সমস্ত ওয়েব সুরক্ষা অক্ষম করতে পারেন।

উদাহরণস্বরূপ: "সি: \ প্রোগ্রাম ফাইলগুলি \ গুগল \ ক্রোম \ অ্যাপ্লিকেশন rome chrome.exe" - অক্ষম-ওয়েব-সুরক্ষা --user-data-dir = "সি: \ নতুন ক্রোমসেটেটিং উইথআউটসিকিউরিটি"। আপনি প্রথমে ক্রোমের একটি নতুন শর্টকাট তৈরি করতে পারবেন, এর বৈশিষ্ট্যগুলিতে যান এবং উপরে হিসাবে লক্ষ্য পরিবর্তন করতে পারেন। এই সাহায্য করা উচিত!


আপনি সত্যিই কোনও বৈশিষ্ট্য সক্ষম করতে ওপি তার ক্লায়েন্টদের ব্রাউজার সুরক্ষা বন্ধ করতে বলার আশা করতে পারবেন না ,?
সোয়ারোগ

@ এসভারোগ এটি বেশিরভাগ দেব উদ্দেশ্যে, বেশিরভাগ প্রোডাকশন সার্ভারে আপনি এই সমস্যার মুখোমুখি হবেন না।
অরিজিৎ পাত্র

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

-2

কনটেন্ট-টাইপকে অপরিজ্ঞায়িত করা জাভাস্ক্রিপ্টকে শিরোনামের ডেটা যেমন হয় তেমন পাস করার জন্য এবং ডিফল্ট কৌণিক $ httpProvider শিরোনাম কনফিগারেশন লিখতে পারে। কৌণিক $ http ডকুমেন্টেশন

$http({url:url,method:"POST", headers:{'Content-Type':undefined}).then(success,failure);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.