2017-01-23 13 views
9

Am का एक त्रुटि देता है, लेकिन यहyii2 बाकी हिस्सों में वाहक टोकन पासिंग angular2 और yii2 शोकहारा सेवाओं का उपयोग कर 401

विफल रहता है यह मेरा angular2 हिस्सा है

In the userservice 
constructor(private http:HttpClientService, private _domaindetails:Domaindetails) { } 

profile(val:string="profile"):Observable<User>{ 
return this.http.get(this.getUserUrl(val)) 
    .map(this.extractData) 

} 

यह httpclientService

createAuthorizationHeader(headers: Headers) { 
    let token = JSON.parse(localStorage.getItem("currentUser")).token; 
    if (token) { 
    headers.append('Authorization', 'Bearer ' + token); 
    headers.append('Content-Type', 'application/x-www-form-urlencoded'); 
    headers.append('Content-Type', 'application/json'); 
    } 

    } 

post(url, data) { 
    let headers = new Headers(); 
    this.createAuthorizationHeader(headers); 
return this.http.post(url, data, { 
    headers: headers 
}); 
} 
है

यह मेरा बैकएंड है Yii2

public function behaviors() 
{ 
    $behaviors = parent::behaviors(); 
    $behaviors['corsFilter'] = [ 
     'class' => \yii\filters\Cors::className(), 
     'cors' => [ 
      // restrict access to 
      'Origin' => ['http://localhost:4200'], 
      'Access-Control-Request-Method' => ['POST', 'GET','PUT'], 
      // Allow only POST and PUT methods 
      'Access-Control-Request-Headers' => ['*'], 
      // Allow only headers 'X-Wsse' 
      // 'Access-Control-Allow-Credentials' => true, 
      // Allow OPTIONS caching 
      'Access-Control-Max-Age' => 3600, 
      // Allow the X-Pagination-Current-Page header to be exposed to the browser. 
      'Access-Control-Expose-Headers' => ['X-Pagination-Current-Page'], 
     ], 
    ]; 

    $auth = $behaviors['authenticator'] = [ 
     'class' => HttpBearerAuth::className(), 
     'only' => ['can-access','profile'], //access controller 
    ]; 

    $behaviors['authenticator']['except'] = ['options']; 
    return $behaviors; 
} 

और yii2 कार्रवाई अनाधिकृत उपयोग

public function actionProfile() 
{ 

    $user = Yii::$app->user->identity; 
    return ['data' => $user]; 
} 

की एक त्रुटि लौटने जब मैं जाँच Yii::$app->request->headers;

enter image description here

आप देख सकते हैं वाहक टोकन

सेट किया गया है यह मेरा usermodel है विफल रहता है

public static function findIdentityByAccessToken($token, $type = null) 
{ 
    return static::findOne(['auth_key' => $token]); //auth_key is the value used in bearer token 
} 

क्यों यह एक त्रुटि 401 अनधिकृत पहुँच लौटने और कुछ अनुसंधान के बाद

अभी तक जब मैं डाकिया में हेडर वाहक authkey का एक ही मूल्य और प्राधिकरण सेट का उपयोग यह काम करता है पर रखता है मैं पता चला है कि जब भी angular2 एक अनुरोध करता है यह जो

+0

क्या आपने "प्रामाणिक" के बजाय व्यवहार को "bearerAuth" पर सेट करने का प्रयास किया है? – kyle

+0

यह भी असफल हो जाता है और अज्ञात bearerAuth –

उत्तर

1

विफल रहता है जो लोग इस समस्या को मैं पता चला कि इस HttpBearerAuth के कारण हुई थी सामना करना पड़ सकता के लिए एक विकल्प अनुरोध भेजता है और जब मैं QueryParamAuth सब कुछ करने के लिए बदल अब काम कर रहा है मैं भी

ON THE CONTROLLER 
1.Removed the cors filters 

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

    $behaviors['authenticator'] = [ 
     'class' => CompositeAuth::className(), 
     'authMethods' => [ 
      HttpBasicAuth::className(), 
      HttpBearerAuth::className(), 
      QueryParamAuth::className(), 
     ], 
    ]; 
    return $behaviors; 

} 
के रूप में कुछ अन्य बदलाव किए

2, मेरे सह में nfig main.php

 'response' => [ 
     'format' => yii\web\Response::FORMAT_JSON, 
     'charset' => 'UTF-8', 
     'on beforeSend' => function ($event) { 
      header("Access-Control-Allow-Origin: *"); 
     } 
    ], 
     'urlManager' => [ 
     'class' => 'yii\web\UrlManager', 
     'enablePrettyUrl' => true, 
     'showScriptName' => false, 
     'rules' => [ 
      ['class' => 'yii\rest\UrlRule', 'controller' => 'auth', 'pluralize'=>false], 
      ...other controlers here 
     ], 

    ], 

परियोजना जड़ में .htacess फ़ाइल मैं

Header set Access-Control-Allow-Origin "*" 
    Header set Access-Control-Allow-Headers "Content-Type" 

तो मेरी angular2 पोस्ट अनुरोध लगता है कि

http://127.0.0.1/bcl/api/rest/v1/auth/logout?access-token=your access token 

तो पहुँच टोकन है जोड़ा 3.In हमेशा एक क्वेरी पैरामीटर के रूप में पारित

मुख्य कारण यह है कि मुझे पता चला कि ब्राउज़र ब्राउन सीन डी एस सामग्री प्रकार से अलग किसी भी शीर्ष लेख एक विकल्प अनुरोध

शुरू हो रहा है तो अब मेरी हेडर देखो की तरह

headers.append('Content-Type', 'application/x-www-form-urlencoded'); 
//i removed the bearer token 
1

मैं एक अलग दृष्टिकोण का इस्तेमाल किया: नियंत्रक में

जोड़ा गया

public function beforeAction($action) 
    { 
     $this->enableCsrfValidation = false; 
     parent::beforeAction($action); 

     if (Yii::$app->getRequest()->getMethod() === 'OPTIONS') { 
      // End it, otherwise a 401 will be shown. 
      Yii::$app->end(); 
     } 

     return true; 
    } 

व्यवहार आपके प्रश्न पर कार्य करता है।

जैसा कि आपने बताया है, मुद्दा यह है कि ब्राउज़र एक प्रीफलाइट अनुरोध भेजता है।

मेरी धारणा यह है कि आप एक क्रॉस ब्राउज़र अनुरोध (लोकलहोस्ट: 4200) बना रहे हैं, इसलिए ब्राउज़र "एक्सेस-कंट्रोल-स्वीट" सेटिंग्स को खोजने के लिए पहले सर्वर पर एक विकल्प अनुरोध कर रहा है, लेकिन बिना पहुंच के हेडर में टोकन। तो एक 401 फेंक दिया गया है और सीओआरएस प्रक्रिया बाधित है।

अंतर यह है कि इस तरह, आप शीर्षलेख में प्राधिकरण टोकन प्राप्त कर सकते हैं।

+0

लौटाता है मैंने आपकी विधि की कोशिश की लेकिन मुझे लगता है कि व्यवहार पहले से पहले एक्शन –

+0

व्यवहार से पहले निष्पादित किए गए हैं (व्यवहार '=> [' * '] को सभी होस्टों को अनुमति देने के लिए। मैंने देखा कि आपने कॉन्फ़िगरेशन के अंदर अपने समाधान में ऐसा ही किया है। वैसे भी यह कोणीय मेजबान से मेल खाना चाहिए। –