2016-10-18 10 views
-1

私は、Aong2を使ってmongoDBとyii2でapiを保護しようとしていました。 AouthをmongoDBに接続することはできません。誰でもyii2のoauth2用のストレージとしてmongoDBを使用する方法を知っています。 あなたの助けに感謝します。OAuth with mongoDb in yii2

return [ 
    'id' => 'app-api', 
    'basePath' => dirname(__DIR__), 
    'bootstrap' => ['oauth2'], 
    'modules' => [ 
     'v1' => [ 
      'basePath' => '@app/modules/v1', 
      'class' => 'api\modules\v1\Module' 
     ], 
     'oauth2' => [ 
      'class' => 'filsh\yii2\oauth2server\Module', 
      'tokenParamName' => 'accessToken', 
      'tokenAccessLifetime' => 3600 * 24, 
      'storageMap' => [ 
       'user_credentials' => 'common\models\Users', 
       'refresh_token' => 'filsh\yii2\oauth2server\storage\Mongo', 
       'access_token' => 'filsh\yii2\oauth2server\storage\Mongo', 
       'client' => 'filsh\yii2\oauth2server\storage\Mongo', 
       'authorization_code' => 'filsh\yii2\oauth2server\storage\Mongo', 
       'client_credentials' => 'filsh\yii2\oauth2server\storage\Mongo', 
       'public_key' => 'filsh\yii2\oauth2server\storage\Mongo', 
       'jwt_bearer' => 'filsh\yii2\oauth2server\storage\Mongo', 
       'scope' => 'filsh\yii2\oauth2server\storage\Mongo', 
      ], 
      'grantTypes' => [ 
       'user_credentials' => [ 
        'class' => 'OAuth2\GrantType\UserCredentials', 
       ], 
       'refresh_token' => [ 
        'class' => 'OAuth2\GrantType\RefreshToken', 
        'always_issue_new_refresh_token' => true 
       ] 
      ] 
     ] 
    ], 

Storgage/Mongo.phpそれは示すエラー...

namespace filsh\yii2\oauth2server\storage; 

class Mongo extends \OAuth2\Storage\Mongo 
{ 
    protected $db; 
    protected $config; 

    public function __construct($connection, $config = array()) 
    { 
//   print_r($connection); 
     if ($connection instanceof MongoDB) { 

      $this->db = $connection; 
     } 
     else { 
      if (!is_array($connection)) { 
       throw new InvalidArgumentException('First argument to OAuth2_Storage_Mongo must be an instance of MongoDB or a configuration array'); 
      } 
      $server = sprintf('mongodb://%s:%d', "localhost", "27017"); 
      $m = new MongoClient($server); 
      $this->db = $m->{"test"}; 
     } 

     // Unix timestamps might get larger than 32 bits, 
     // so let's add native support for 64 bit ints. 
     ini_set('mongo.native_long', 1); 

     $this->config = array_merge(array(
      'client_table' => 'oauth_clients', 
      'access_token_table' => 'oauth_access_tokens', 
      'refresh_token_table' => 'oauth_refresh_tokens', 
      'code_table' => 'oauth_authorization_codes', 
      'user_table' => 'oauth_users', 
      'jwt_table' => 'oauth_jwt', 
     ), $config); 
    } 

    // Helper function to access a MongoDB collection by `type`: 
    protected function collection($name) 
    { 
     return $this->db->{$this->config[$name]}; 
    } 

    /* ClientCredentialsInterface */ 
    public function checkClientCredentials($client_id, $client_secret = null) 
    { 
     $result = $this->collection('client_table')->findOne(array('client_id' => $client_id)); 

     return $result['client_secret'] == $client_secret; 
    } 

    public function getClientDetails($client_id) 
    { 
     $result = $this->collection('client_table')->findOne(array('client_id' => $client_id)); 

     return is_null($result) ? false : $result; 
    } 

    public function checkRestrictedGrantType($client_id, $grant_type) 
    { 
     $details = $this->getClientDetails($client_id); 
     if (isset($details['grant_types'])) { 
      return in_array($grant_type, (array) $details['grant_types']); 
     } 

     // if grant_types are not defined, then none are restricted 
     return true; 
    } 

    /* AccessTokenInterface */ 
    public function getAccessToken($access_token) 
    { 
     $token = $this->collection('access_token_table')->findOne(array('access_token' => $access_token)); 

     return is_null($token) ? false : $token; 
    } 

    public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null) 
    { 
     // if it exists, update it. 
     if ($this->getAccessToken($access_token)) { 
      $this->collection('access_token_table')->update(
       array('access_token' => $access_token), 
       array('$set' => array(
        'client_id' => $client_id, 
        'expires' => $expires, 
        'user_id' => $user_id, 
        'scope' => $scope 
       )) 
      ); 
     } else { 
      $this->collection('access_token_table')->insert(
       array(
        'access_token' => $access_token, 
        'client_id' => $client_id, 
        'expires' => $expires, 
        'user_id' => $user_id, 
        'scope' => $scope 
       ) 
      ); 
     } 

     return true; 
    } 


    /* AuthorizationCodeInterface */ 
    public function getAuthorizationCode($code) 
    { 
     $code = $this->collection('code_table')->findOne(array('authorization_code' => $code)); 

     return is_null($code) ? false : $code; 
    } 

    public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $token_id = null) 
    { 
     // if it exists, update it. 
     if ($this->getAuthorizationCode($code)) { 
      $this->collection('code_table')->update(
       array('authorization_code' => $code), 
       array('$set' => array(
        'client_id' => $client_id, 
        'user_id' => $user_id, 
        'redirect_uri' => $redirect_uri, 
        'expires' => $expires, 
        'scope' => $scope 
       )) 
      ); 
     } else { 
      $this->collection('code_table')->insert(
       array(
        'authorization_code' => $code, 
        'client_id' => $client_id, 
        'user_id' => $user_id, 
        'redirect_uri' => $redirect_uri, 
        'expires' => $expires, 
        'scope' => $scope 
       ) 
      ); 
     } 

     return true; 
    } 

    public function expireAuthorizationCode($code) 
    { 
     $this->collection('code_table')->remove(array('authorization_code' => $code)); 

     return true; 
    } 


    /* UserCredentialsInterface */ 
    public function checkUserCredentials($username, $password) 
    { 
     if ($user = $this->getUser($username)) { 
      return $this->checkPassword($user, $password); 
     } 
     return false; 
    } 

    public function getUserDetails($username) 
    { 
     if ($user = $this->getUser($username)) { 
      $user['user_id'] = $user['username']; 
     } 

     return $user; 
    } 

    /* RefreshTokenInterface */ 
    public function getRefreshToken($refresh_token) 
    { 

     $token = $this->collection('refresh_token_table')->findOne(array('refresh_token' => $refresh_token)); 

     return is_null($token) ? false : $token; 
    } 

    public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null) 
    { 

     $this->collection('refresh_token_table')->insert(
      array(
       'refresh_token' => $refresh_token, 
       'client_id' => $client_id, 
       'user_id' => $user_id, 
       'expires' => $expires, 
       'scope' => $scope 
      ) 
     ); 

     return true; 
    } 

    public function unsetRefreshToken($refresh_token) 
    { 
     $this->collection('refresh_token_table')->remove(array('refresh_token' => $refresh_token)); 

     return true; 
    } 


    // plaintext passwords are bad! Override this for your application 
    protected function checkPassword($user, $password) 
    { 
     return $user['password'] == $password; 
    } 

    public function getUser($username) 
    { 
     $result = $this->collection('user_table')->findOne(array('username' => $username)); 

     return is_null($result) ? false : $result; 
    } 

    public function setUser($username, $password, $firstName = null, $lastName = null) 
    { 
     if ($this->getUser($username)) { 
      $this->collection('user_table')->update(
       array('username' => $username), 
       array('$set' => array(
        'password' => $password, 
        'first_name' => $firstName, 
        'last_name' => $lastName 
       )) 
      ); 
     } else { 
      $this->collection('user_table')->insert(
       array(
        'username' => $username, 
        'password' => $password, 
        'first_name' => $firstName, 
        'last_name' => $lastName 
       ) 
      ); 
     } 

     return true; 
    } 

    public function getClientKey($client_id, $subject) 
    { 
     $result = $this->collection('jwt_table')->findOne(array(
      'client_id' => $client_id, 
      'subject' => $subject 
     )); 

     return $result; 
    } 
} 

ファイル

{ 
    "name": "Invalid Configuration", 
    "message": "Missing required parameter \"connection\" when instantiating \"filsh\\yii2\\oauth2server\\storage\\Mongo\".", 
    "code": 0, 
    "type": "yii\\base\\InvalidConfigException", 
    "file": "/var/www/html/advanced/vendor/yiisoft/yii2/di/Container.php", 
    "line": 457, 
    "stack-trace": [ 
    "#0 /var/www/html/advanced/vendor/yiisoft/yii2/di/Container.php(367): yii\\di\\Container->resolveDependencies(Array, Object(ReflectionClass))", 
    "#1 /var/www/html/advanced/vendor/yiisoft/yii2/di/Container.php(154): yii\\di\\Container->build('filsh\\yii2\\oaut...', Array, Array)", 
    "#2 /var/www/html/advanced/vendor/yiisoft/yii2/di/Container.php(172): yii\\di\\Container->get('filsh\\yii2\\oaut...', Array, Array)", 
    "#3 /var/www/html/advanced/vendor/filsh/yii2-oauth2-server/Module.php(80): yii\\di\\Container->get('refresh_token')", 
    "#4 /var/www/html/advanced/vendor/filsh/yii2-oauth2-server/controllers/RestController.php(25): filsh\\yii2\\oauth2server\\Module->getServer()", 
    "#5 [internal function]: filsh\\yii2\\oauth2server\\controllers\\RestController->actionToken()", 
    "#6 /var/www/html/advanced/vendor/yiisoft/yii2/base/InlineAction.php(55): call_user_func_array(Array, Array)", 
    "#7 /var/www/html/advanced/vendor/yiisoft/yii2/base/Controller.php(154): yii\\base\\InlineAction->runWithParams(Array)", 
    "#8 /var/www/html/advanced/vendor/yiisoft/yii2/base/Module.php(454): yii\\base\\Controller->runAction('token', Array)", 
    "#9 /var/www/html/advanced/vendor/yiisoft/yii2/web/Application.php(87): yii\\base\\Module->runAction('oauth2/rest/tok...', Array)", 
    "#10 /var/www/html/advanced/vendor/yiisoft/yii2/base/Application.php(375): yii\\web\\Application->handleRequest(Object(yii\\web\\Request))", 
    "#11 /var/www/html/advanced/api/web/index.php(19): yii\\base\\Application->run()", 
    "#12 {main}" 
    ] 
} 
+0

ケースに関する詳細情報をご提供ください。何がうまくいかない? – ZhukovRA

+0

@ZhukovRA私は自分の質問を編集しました。 – Tariq

答えて

0

です: は

下の設定ファイルとして コードの流れがあるありがとうあなたの間違いはモジュール構成にあると思います。

  'refresh_token' => 'filsh\yii2\oauth2server\storage\Mongo', 
      'access_token' => 'filsh\yii2\oauth2server\storage\Mongo', 
      'client' => 'filsh\yii2\oauth2server\storage\Mongo', 
      'authorization_code' => 'filsh\yii2\oauth2server\storage\Mongo', 
      'client_credentials' => 'filsh\yii2\oauth2server\storage\Mongo', 
      'public_key' => 'filsh\yii2\oauth2server\storage\Mongo', 
      'jwt_bearer' => 'filsh\yii2\oauth2server\storage\Mongo', 
      'scope' => 'filsh\yii2\oauth2server\storage\Mongo', 

この文字列は必要ありません。 official github repoにインストール手順をお読みください。 Userクラスは、MongoDbを使用する必要がある場合は、MongoDb接続を使用する必要があります。