From ac17e60c55db69d68016def0616294e9822dbbdc Mon Sep 17 00:00:00 2001 From: Jaspar Gupta Date: Wed, 22 Jan 2020 10:16:45 +0000 Subject: [PATCH 1/5] fix: refresh tokens --- composer.json | 1 + src/MongodbPassportServiceProvider.php | 61 ++++++++++++++----- .../Bridge/RefreshTokenRepository.php | 30 +++++++++ src/Passport/RefreshTokenRepository.php | 23 +++++++ 4 files changed, 101 insertions(+), 14 deletions(-) create mode 100644 src/Passport/Bridge/RefreshTokenRepository.php create mode 100644 src/Passport/RefreshTokenRepository.php diff --git a/composer.json b/composer.json index b29b522..e4d8f79 100644 --- a/composer.json +++ b/composer.json @@ -13,6 +13,7 @@ "designmynight" ], "require": { + "ext-mongodb": "*", "illuminate/support": "^5.5 || ^6.0", "jenssegers/mongodb": "3.3.* || 3.4.* || 3.5.* || 3.6.*", "laravel/passport": "4.0.* || 5.0.* || 6.0.* || 7.0.* || 7.4.* || 7.5.* || ^8.0" diff --git a/src/MongodbPassportServiceProvider.php b/src/MongodbPassportServiceProvider.php index d7fb365..7a49c71 100644 --- a/src/MongodbPassportServiceProvider.php +++ b/src/MongodbPassportServiceProvider.php @@ -2,6 +2,8 @@ namespace DesignMyNight\Mongodb; +use DesignMyNight\Mongodb\Passport\Bridge\RefreshTokenRepository as BridgeRefreshTokenRepository; +use DesignMyNight\Mongodb\Passport\RefreshTokenRepository; use Illuminate\Support\ServiceProvider; use DesignMyNight\Mongodb\Passport\AuthCode; use DesignMyNight\Mongodb\Passport\Client; @@ -10,22 +12,53 @@ class MongodbPassportServiceProvider extends ServiceProvider { + /** @var string */ + private $method = 'alias'; + + /** @var array */ + private $aliases = [ + 'Laravel\Passport\AuthCode' => AuthCode::class, + 'Laravel\Passport\Bridge\RefreshTokenRepository' => BridgeRefreshTokenRepository::class, + 'Laravel\Passport\Client' => Client::class, + 'Laravel\Passport\PersonalAccessClient' => PersonalAccessClient::class, + 'Laravel\Passport\RefreshTokenRepository' => RefreshTokenRepository::class, + 'Laravel\Passport\Token' => Token::class, + ]; + + /** @var Illuminate\Foundation\AliasLoader */ + private $loader; + + /** + * @return void + */ public function register() { - /* - * Passport client extends Eloquent model by default, so we alias them. - */ - if (class_exists('Illuminate\Foundation\AliasLoader')) { - $loader = \Illuminate\Foundation\AliasLoader::getInstance(); - $loader->alias('Laravel\Passport\AuthCode', AuthCode::class); - $loader->alias('Laravel\Passport\Client', Client::class); - $loader->alias('Laravel\Passport\PersonalAccessClient', PersonalAccessClient::class); - $loader->alias('Laravel\Passport\Token', Token::class); - } else { - class_alias('Laravel\Passport\AuthCode', AuthCode::class); - class_alias('Laravel\Passport\Client', Client::class); - class_alias('Laravel\Passport\PersonalAccessClient', PersonalAccessClient::class); - class_alias('Laravel\Passport\Token', Token::class); + if (class_exists($loader = 'Illuminate\Foundation\AliasLoader')) { + $this->loader = $loader::getInstance(); + $this->method = 'loadAlias'; } + + foreach ($this->aliases as $original => $alias) { + $this->{$this->method}($original, $alias); + } + } + + /** + * @param string $original + * @param string $alias + */ + private function alias(string $original, string $alias): void + { + class_alias($original, $alias); + } + + /** + * @param string $original + * @param string $alias + */ + private function loadAlias(string $original, string $alias): void + { + // Passport client extends Eloquent model by default, so we alias them. + $this->loader->alias($original, $alias); } } diff --git a/src/Passport/Bridge/RefreshTokenRepository.php b/src/Passport/Bridge/RefreshTokenRepository.php new file mode 100644 index 0000000..73812bd --- /dev/null +++ b/src/Passport/Bridge/RefreshTokenRepository.php @@ -0,0 +1,30 @@ +refreshTokenRepository->create([ + 'id' => $id = $refreshTokenEntity->getIdentifier(), + 'access_token_id' => $accessTokenId = $refreshTokenEntity->getAccessToken()->getIdentifier(), + 'revoked' => false, + 'expires_at' => new UTCDateTime($refreshTokenEntity->getExpiryDateTime()->getTimestamp() * 1000), + ]); + + $this->events->dispatch(new RefreshTokenCreated($id, $accessTokenId)); + } +} diff --git a/src/Passport/RefreshTokenRepository.php b/src/Passport/RefreshTokenRepository.php new file mode 100644 index 0000000..e83a486 --- /dev/null +++ b/src/Passport/RefreshTokenRepository.php @@ -0,0 +1,23 @@ +find($id)) { + return $token['revoked']; + } + + return true; + } +} From c1195b51dff78b59245b29e9b5315a2c28af0f13 Mon Sep 17 00:00:00 2001 From: Jaspar Gupta Date: Thu, 16 Apr 2020 15:32:55 +0100 Subject: [PATCH 2/5] feat: refresh token model --- src/MongodbPassportServiceProvider.php | 2 ++ src/Passport/Bridge/RefreshToken.php | 49 ++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 src/Passport/Bridge/RefreshToken.php diff --git a/src/MongodbPassportServiceProvider.php b/src/MongodbPassportServiceProvider.php index 7a49c71..81e4fea 100644 --- a/src/MongodbPassportServiceProvider.php +++ b/src/MongodbPassportServiceProvider.php @@ -2,6 +2,7 @@ namespace DesignMyNight\Mongodb; +use DesignMyNight\Mongodb\Passport\Bridge\RefreshToken; use DesignMyNight\Mongodb\Passport\Bridge\RefreshTokenRepository as BridgeRefreshTokenRepository; use DesignMyNight\Mongodb\Passport\RefreshTokenRepository; use Illuminate\Support\ServiceProvider; @@ -18,6 +19,7 @@ class MongodbPassportServiceProvider extends ServiceProvider /** @var array */ private $aliases = [ 'Laravel\Passport\AuthCode' => AuthCode::class, + 'Laravel\Passport\Bridge\RefreshToken' => RefreshToken::class, 'Laravel\Passport\Bridge\RefreshTokenRepository' => BridgeRefreshTokenRepository::class, 'Laravel\Passport\Client' => Client::class, 'Laravel\Passport\PersonalAccessClient' => PersonalAccessClient::class, diff --git a/src/Passport/Bridge/RefreshToken.php b/src/Passport/Bridge/RefreshToken.php new file mode 100644 index 0000000..5bf555b --- /dev/null +++ b/src/Passport/Bridge/RefreshToken.php @@ -0,0 +1,49 @@ + 'bool', + ]; + + /** + * @var string[] + */ + protected $dates = ['expires_at']; + + /** + * @var array + */ + protected $guarded = []; + + /** + * @var bool + */ + public $incrementing = false; + + /** + * @var string + */ + protected $primaryKey = 'id'; + + /** + * @var string + */ + protected $table = 'oauth_refresh_tokens'; +} From 11bbb6ddfef255c4a88e80272f4dc97db7ccb4ea Mon Sep 17 00:00:00 2001 From: Jaspar Gupta Date: Thu, 16 Apr 2020 17:24:44 +0100 Subject: [PATCH 3/5] refactor: refresh token feature --- composer.json | 3 +- src/MongodbPassportServiceProvider.php | 58 ++++--------------- src/Passport/Bridge/RefreshToken.php | 5 ++ .../Bridge/RefreshTokenRepository.php | 24 +++++++- src/Passport/RefreshTokenRepository.php | 23 -------- 5 files changed, 39 insertions(+), 74 deletions(-) delete mode 100644 src/Passport/RefreshTokenRepository.php diff --git a/composer.json b/composer.json index e4d8f79..3bf0a0f 100644 --- a/composer.json +++ b/composer.json @@ -13,10 +13,11 @@ "designmynight" ], "require": { + "php": "^7.1", "ext-mongodb": "*", "illuminate/support": "^5.5 || ^6.0", "jenssegers/mongodb": "3.3.* || 3.4.* || 3.5.* || 3.6.*", - "laravel/passport": "4.0.* || 5.0.* || 6.0.* || 7.0.* || 7.4.* || 7.5.* || ^8.0" + "laravel/passport": "6.0.* || 7.0.* || 7.4.* || 7.5.* || ^8.0" }, "autoload": { "psr-4": { diff --git a/src/MongodbPassportServiceProvider.php b/src/MongodbPassportServiceProvider.php index 81e4fea..f2a7b7a 100644 --- a/src/MongodbPassportServiceProvider.php +++ b/src/MongodbPassportServiceProvider.php @@ -2,65 +2,29 @@ namespace DesignMyNight\Mongodb; -use DesignMyNight\Mongodb\Passport\Bridge\RefreshToken; -use DesignMyNight\Mongodb\Passport\Bridge\RefreshTokenRepository as BridgeRefreshTokenRepository; -use DesignMyNight\Mongodb\Passport\RefreshTokenRepository; use Illuminate\Support\ServiceProvider; use DesignMyNight\Mongodb\Passport\AuthCode; +use DesignMyNight\Mongodb\Passport\Bridge\RefreshTokenRepository; use DesignMyNight\Mongodb\Passport\Client; use DesignMyNight\Mongodb\Passport\PersonalAccessClient; use DesignMyNight\Mongodb\Passport\Token; +use Laravel\Passport\Bridge\RefreshTokenRepository as PassportRefreshTokenRepository; +use Laravel\Passport\Passport; class MongodbPassportServiceProvider extends ServiceProvider { - /** @var string */ - private $method = 'alias'; - - /** @var array */ - private $aliases = [ - 'Laravel\Passport\AuthCode' => AuthCode::class, - 'Laravel\Passport\Bridge\RefreshToken' => RefreshToken::class, - 'Laravel\Passport\Bridge\RefreshTokenRepository' => BridgeRefreshTokenRepository::class, - 'Laravel\Passport\Client' => Client::class, - 'Laravel\Passport\PersonalAccessClient' => PersonalAccessClient::class, - 'Laravel\Passport\RefreshTokenRepository' => RefreshTokenRepository::class, - 'Laravel\Passport\Token' => Token::class, - ]; - - /** @var Illuminate\Foundation\AliasLoader */ - private $loader; - /** * @return void */ public function register() { - if (class_exists($loader = 'Illuminate\Foundation\AliasLoader')) { - $this->loader = $loader::getInstance(); - $this->method = 'loadAlias'; - } - - foreach ($this->aliases as $original => $alias) { - $this->{$this->method}($original, $alias); - } - } - - /** - * @param string $original - * @param string $alias - */ - private function alias(string $original, string $alias): void - { - class_alias($original, $alias); - } - - /** - * @param string $original - * @param string $alias - */ - private function loadAlias(string $original, string $alias): void - { - // Passport client extends Eloquent model by default, so we alias them. - $this->loader->alias($original, $alias); + Passport::useAuthCodeModel(AuthCode::class); + Passport::useClientModel(Client::class); + Passport::usePersonalAccessClientModel(PersonalAccessClient::class); + Passport::useTokenModel(Token::class); + + $this->app->bind(PassportRefreshTokenRepository::class, function () { + return $this->app->make(RefreshTokenRepository::class); + }); } } diff --git a/src/Passport/Bridge/RefreshToken.php b/src/Passport/Bridge/RefreshToken.php index 5bf555b..4d32731 100644 --- a/src/Passport/Bridge/RefreshToken.php +++ b/src/Passport/Bridge/RefreshToken.php @@ -46,4 +46,9 @@ class RefreshToken extends Model implements RefreshTokenEntityInterface * @var string */ protected $table = 'oauth_refresh_tokens'; + + /** + * @var bool + */ + public $timestamps = false; } diff --git a/src/Passport/Bridge/RefreshTokenRepository.php b/src/Passport/Bridge/RefreshTokenRepository.php index 73812bd..f0805ab 100644 --- a/src/Passport/Bridge/RefreshTokenRepository.php +++ b/src/Passport/Bridge/RefreshTokenRepository.php @@ -5,7 +5,6 @@ use Laravel\Passport\Bridge\RefreshTokenRepository as BaseRefreshTokenRepository; use Laravel\Passport\Events\RefreshTokenCreated; use League\OAuth2\Server\Entities\RefreshTokenEntityInterface; -use MongoDB\BSON\UTCDateTime; /** * Class RefreshTokenRepository @@ -16,13 +15,32 @@ class RefreshTokenRepository extends BaseRefreshTokenRepository /** * @inheritDoc */ + public function getNewRefreshToken() + { + return new RefreshToken(); + } + + /** + * {@inheritdoc} + */ + public function isRefreshTokenRevoked($tokenId) + { + $refreshToken = $this->database->table('oauth_refresh_tokens') + ->where('id', $tokenId)->first(); + + return $refreshToken === null || $refreshToken['revoked']; + } + + /** + * @param RefreshToken|RefreshTokenEntityInterface $refreshTokenEntity + */ public function persistNewRefreshToken(RefreshTokenEntityInterface $refreshTokenEntity) { - $this->refreshTokenRepository->create([ + $refreshTokenEntity->newModelQuery()->create([ 'id' => $id = $refreshTokenEntity->getIdentifier(), 'access_token_id' => $accessTokenId = $refreshTokenEntity->getAccessToken()->getIdentifier(), 'revoked' => false, - 'expires_at' => new UTCDateTime($refreshTokenEntity->getExpiryDateTime()->getTimestamp() * 1000), + 'expires_at' => $refreshTokenEntity->getExpiryDateTime(), ]); $this->events->dispatch(new RefreshTokenCreated($id, $accessTokenId)); diff --git a/src/Passport/RefreshTokenRepository.php b/src/Passport/RefreshTokenRepository.php deleted file mode 100644 index e83a486..0000000 --- a/src/Passport/RefreshTokenRepository.php +++ /dev/null @@ -1,23 +0,0 @@ -find($id)) { - return $token['revoked']; - } - - return true; - } -} From 509d3f31d52a7abc8a53c684e999151562f585ee Mon Sep 17 00:00:00 2001 From: Jaspar Gupta Date: Thu, 16 Apr 2020 17:26:47 +0100 Subject: [PATCH 4/5] refactor: php version constraint --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 3bf0a0f..3897326 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,7 @@ "designmynight" ], "require": { - "php": "^7.1", + "php": ">=7.1", "ext-mongodb": "*", "illuminate/support": "^5.5 || ^6.0", "jenssegers/mongodb": "3.3.* || 3.4.* || 3.5.* || 3.6.*", From 7150d37c41f806ddd3c170be834e42e0b26007e8 Mon Sep 17 00:00:00 2001 From: Jaspar Gupta Date: Thu, 16 Apr 2020 17:28:46 +0100 Subject: [PATCH 5/5] refactor: remove mongodb dependency, constraint is provided in another dependency --- composer.json | 1 - 1 file changed, 1 deletion(-) diff --git a/composer.json b/composer.json index 3897326..a95531a 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,6 @@ ], "require": { "php": ">=7.1", - "ext-mongodb": "*", "illuminate/support": "^5.5 || ^6.0", "jenssegers/mongodb": "3.3.* || 3.4.* || 3.5.* || 3.6.*", "laravel/passport": "6.0.* || 7.0.* || 7.4.* || 7.5.* || ^8.0"