2016-02-12 5 views
5

मैंने कोणीय & Yii2 REST सेवा विकसित की है। क्रॉस डोमेन में समस्या है। नीचे मेरे कोणीय & Yii2 REST कोड जोड़ें।Yii2 REST + कोणीय क्रॉस डोमेन CORS

AngularJS: (जैसे 'http://organization1.example.com', 'http://organization2.example.com', ....)

$http.defaults.useXDomain = true; 
$http.defaults.withCredentials = true; 
$http.defaults.headers.common['Authorization'] = 'Bearer ' + MYTOKEN 

मेरे कोणीय नियंत्रक से अनुरोध:

apiURL = 'http://api.example.com'; 
$http.get(apiURL + '/roles') 
    .success(function (roles) { }) 
    .error(function() { }); 

Yii2 .htaccess: (बाकी की तरह यूआरएल ' http://api.example.com ')

Header always set Access-Control-Allow-Origin: "*" 
Header always set Access-Control-Allow-Credentials: true 
Header always set Access-Control-Allow-Methods "POST, GET, PUT, DELETE, OPTIONS" 
Header always set Access-Control-Allow-Headers "Authorization,X-Requested-With, content-type" 

Yii2 मेरे व्यवहार:

public function behaviors() { 
    $behaviors = parent::behaviors(); 
    $behaviors['corsFilter'] = [ 
     'class' => Cors::className(), 
     'cors' => [ 
      'Origin' => ['*'], 
      'Access-Control-Expose-Headers' => [ 
       'X-Pagination-Per-Page', 
       'X-Pagination-Total-Count', 
       'X-Pagination-Current-Page', 
       'X-Pagination-Page-Count', 
      ], 
     ], 
    ]; 
    $behaviors['authenticator'] = [ 
     'class' => HttpBearerAuth::className(), 
     'except' => ['options'], 
    ]; 
    $behaviors['contentNegotiator'] = [ 
     'class' => ContentNegotiator::className(), 
     'formats' => [ 
      'application/json' => Response::FORMAT_JSON, 
     ], 
    ]; 

    return $behaviors; 
} 

समस्या

मेरी कोणीय अनुरोध से 'प्राप्त' तरीका है, लेकिन यह होगा चला जाता है 'विकल्प' विधि 401 अनधिकृत त्रुटि (CORS) लौट &। क्योंकि अनुरोध प्राधिकरण शीर्षलेख नहीं भेजा गया है।

उत्तर

0

अपने नियंत्रक में:

use yii\filters\Cors; 
... 
public function behaviors() 
{ 
    return array_merge([ 
     'cors' => [ 
      'class' => Cors::className(), 
      #special rules for particular action 
      'actions' => [ 
       'your-action-name' => [ 
        #web-servers which you alllow cross-domain access 
        'Origin' => ['*'], 
        'Access-Control-Request-Method' => ['POST'], 
        'Access-Control-Request-Headers' => ['*'], 
        'Access-Control-Allow-Credentials' => null, 
        'Access-Control-Max-Age' => 86400, 
        'Access-Control-Expose-Headers' => [], 
       ] 
      ], 
      #common rules 
      'cors' => [ 
       'Origin' => [], 
       'Access-Control-Request-Method' => [], 
       'Access-Control-Request-Headers' => [], 
       'Access-Control-Allow-Credentials' => null, 
       'Access-Control-Max-Age' => 0, 
       'Access-Control-Expose-Headers' => [], 
      ] 
     ], 
    ], parent::behaviors()); 
} 

Documentation

7

अद्यतन:

@jlapoutre से बताया है, यह अब अच्छी तरह से in official docs वर्णित है:

क्रॉस जोड़ना -ऑर्गिन संसाधन शेयरिंग फ़िल्टर करने के लिए एक नियंत्रक एक थोड़ा और अधिक ऊपर वर्णित अन्य फ़िल्टर जोड़ने से जटिल है, क्योंकि CORS फिल्टर से पहले प्रमाणीकरण तरीकों लागू करने के लिए और इस तरह अन्य फिल्टर की तुलना में एक अलग दृष्टिकोण की जरूरत है। सीओआरएस प्रीफलाइट अनुरोधों के लिए भी प्रमाणीकरण को अक्षम किया जाना चाहिए ताकि ब्राउज़र सुरक्षित रूप से निर्धारित कर सके कि प्रमाणीकरण प्रमाण-पत्र भेजने की आवश्यकता के बिना पहले से अनुरोध किया जा सकता है या नहीं।

use yii\filters\auth\HttpBasicAuth; 

public function behaviors() 
{ 
    $behaviors = parent::behaviors(); 

    // remove authentication filter 
    $auth = $behaviors['authenticator']; 
    unset($behaviors['authenticator']); 

    // add CORS filter 
    $behaviors['corsFilter'] = [ 
     'class' => \yii\filters\Cors::className(), 
    ]; 

    // re-add authentication filter 
    $behaviors['authenticator'] = $auth; 
    // avoid authentication on CORS-pre-flight requests (HTTP OPTIONS method) 
    $behaviors['authenticator']['except'] = ['options']; 

    return $behaviors; 
} 

ओल्ड उत्तर(: निम्नलिखित कोड है कि \ Cors एक मौजूदा नियंत्रक कि Yii \ बाकी \ ActiveController तक फैली हुई है के लिए फ़िल्टर Yii \ फिल्टर जोड़ने के लिए की जरूरत है पता चलता बहिष्कृत)

parent::behaviors() के साथ विलय करते समय एक ऑर्डरिंग समस्या है। पूर्ण विवरण here

मैं कुंजी को परिभाषित नहीं जब जनक सरणी के साथ विलय की सिफारिश करेंगे:

public function behaviors() 
{ 
    return \yii\helpers\ArrayHelper::merge([ 
     [ 
      'class' => \yii\filters\Cors::className(), 
      'cors' => [...], 
     ], 
     [ 
      'class' => \yii\filters\auth\HttpBearerAuth::className(), 
      'except' => ['options'], 
     ], 
     [ 
      'class' => ContentNegotiator::className(), 
      'formats' => [...], 
     ] 
    ], parent::behaviors()); 
} 
+1

यह अब स्पष्ट रूप से यहाँ प्रलेखित है: http://www.yiiframework.com/doc-2.0/guide-rest-controllers।एचटीएमएल # कोर - बस इस गाइड का पालन करें और यह काम करेगा। सारांश: सुनिश्चित करें कि प्रमाणीकरण सीओआरएस व्यवहार के बाद आता है और हर समय प्रमाणीकरण से विकल्प बहिष्कृत करता है। – jlapoutre

+0

अपडेट किया गया। धन्यवाद @ jlapoutre –

संबंधित मुद्दे