2016-07-01 5 views
0

yiiフレームワークを使用してAPIを準備しました。 APIには、HTTP_X_USERNAMEおよびHTTP_X_PASSWORDパラメータをチェックし、それらをデータベース内のいくつかのデータと比較する認証メソッドが含まれています。TomcatサーバーでYii Frameworkを使用HTTP_X_USERNAMEはローカルで認識されますがオンラインではありません

テストデベロッパー(WAMP + Eclipse + Tomcat)上のすべてをローカルでテストしていましたが、正常に動作しました。私は郵便配達員とすべてをテストしました。私はこれらの2つのパラメータ(HTTP_X _...)をヘッダに入れました。

プロダクションサーバ(Tomcat)にアップロードしたapiは、ローカルとオンラインの認証データは同じですが、常に認証はFALSEを返します。コードは、これらのパラメータが "APIにアクセスする権限が必要です。ユーザー名とパスワードが設定されていません"と設定されているかどうかをチェックする部分で停止します。

問題はどこにあるのでしょうか?なぜそれはローカルで、オンラインではないのですか?

private function _checkAuth() { 

     $headers = apache_request_headers(); 

     if (! (isset ($headers ['HTTP_X_USERNAME']) and isset ($headers ['HTTP_X_PASSWORD']))) { 
      // Error: Unauthorized 
      $this->badResponse (401, 'You must be authorized to access the api. No USERNAME and PASSWORD set.'); 
     } 

     $username = $headers ['HTTP_X_USERNAME']; 
     $password = $headers ['HTTP_X_PASSWORD']; 

     // Find the user 
     $criteria = new CDbCriteria(); 
     $criteria->addCondition ('email = :email'); 
     $criteria->addCondition('api_access_token = :pass'); 
     $criteria->params = array(':email' => $username, ":pass" => $password); 

     $school = AutoSchool::model()->find ($criteria); 

     if ($school === null) { 
      $this->badResponse (401, 'Error: You must be authorized to access the api.'); 
     } 

     return $school->id; 
    } 

答えて

0

最後に問題が見つかりました!

デバッグ後、問題がapache_request_headers()メソッドであることが判明しました。これは、ヘッダに設定した有用なものを返さなかったためです。

私は自分の方法

private function apache_request_headers2() { 
      foreach($_SERVER as $key=>$value) { 
       if (substr($key,0,5)=="HTTP_") { 
        $key=str_replace(" ","-",ucwords(strtolower(str_replace("_"," ",substr($key,5))))); 
        $out[$key]=$value; 
       }else{ 
        $out[$key]=$value; 
       } 
      } 
      return $out; 
     } 

を実装しかし、これがすべてではありません。私は要求していたヘッダパラメータを変更しなければならなかった。私はHTTP_X_USERNAMEとHTTP_X_PASSWORDの代わりに$ headers ['PHP_AUTH_USER']と$ headers ['PHP_AUTH_PW']を使用しなければなりませんでした。 POSTリクエストを発行しながら、

は、そして最後に、私は基本認証を使用していたとヘッダを設定しないこと

Setting the AUthentication parameters in Postman

Headers

、編集方法の完全なコードパラメータ:

private function _checkAuth() { 

     $headers = $this->apache_request_headers2(); 

     if (! (isset ($headers ['PHP_AUTH_USER']) and isset ($headers ['PHP_AUTH_PW']))) { 
      // Error: Unauthorized 
      $this->badResponse (401, 'You must be authorized to access the api. No USERNAME and PASSWORD set.'); 
     } 

     $username = $headers ['PHP_AUTH_USER']; 
     $password = $headers ['PHP_AUTH_PW']; 

     // Find the user 
     $criteria = new CDbCriteria(); 
     $criteria->addCondition ('email = :email'); 
     $criteria->addCondition('api_access_token = :pass'); 
     $criteria->params = array(':email' => $username, ":pass" => $password); 

     $school = AutoSchool::model()->find ($criteria); 

     if ($school === null) { 
      $this->badResponse (401, 'Error: You must be authorized to access the api.'); 
     } 

     return $school->id; 
    } 
関連する問題