Skip to content

Commit 248fac7

Browse files
author
Jaspar Gupta
authored
fix: refresh tokens (#34)
* fix: refresh tokens * feat: refresh token model * refactor: refresh token feature * refactor: php version constraint * refactor: remove mongodb dependency, constraint is provided in another dependency
1 parent 622037f commit 248fac7

File tree

4 files changed

+118
-18
lines changed

4 files changed

+118
-18
lines changed

composer.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@
1313
"designmynight"
1414
],
1515
"require": {
16+
"php": ">=7.1",
1617
"illuminate/support": "^5.5 || ^6.0",
1718
"jenssegers/mongodb": "3.3.* || 3.4.* || 3.5.* || 3.6.*",
18-
"laravel/passport": "4.0.* || 5.0.* || 6.0.* || 7.0.* || 7.4.* || 7.5.* || ^8.0"
19+
"laravel/passport": "6.0.* || 7.0.* || 7.4.* || 7.5.* || ^8.0"
1920
},
2021
"autoload": {
2122
"psr-4": {

src/MongodbPassportServiceProvider.php

+14-17
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,28 @@
44

55
use Illuminate\Support\ServiceProvider;
66
use DesignMyNight\Mongodb\Passport\AuthCode;
7+
use DesignMyNight\Mongodb\Passport\Bridge\RefreshTokenRepository;
78
use DesignMyNight\Mongodb\Passport\Client;
89
use DesignMyNight\Mongodb\Passport\PersonalAccessClient;
910
use DesignMyNight\Mongodb\Passport\RefreshToken;
1011
use DesignMyNight\Mongodb\Passport\Token;
12+
use Laravel\Passport\Bridge\RefreshTokenRepository as PassportRefreshTokenRepository;
13+
use Laravel\Passport\Passport;
1114

1215
class MongodbPassportServiceProvider extends ServiceProvider
1316
{
17+
/**
18+
* @return void
19+
*/
1420
public function register()
1521
{
16-
/*
17-
* Passport client extends Eloquent model by default, so we alias them.
18-
*/
19-
if (class_exists('Illuminate\Foundation\AliasLoader')) {
20-
$loader = \Illuminate\Foundation\AliasLoader::getInstance();
21-
$loader->alias('Laravel\Passport\AuthCode', AuthCode::class);
22-
$loader->alias('Laravel\Passport\Client', Client::class);
23-
$loader->alias('Laravel\Passport\PersonalAccessClient', PersonalAccessClient::class);
24-
$loader->alias('Laravel\Passport\Token', Token::class);
25-
$loader->alias('Laravel\Passport\RefreshToken', RefreshToken::class);
26-
} else {
27-
class_alias('Laravel\Passport\AuthCode', AuthCode::class);
28-
class_alias('Laravel\Passport\Client', Client::class);
29-
class_alias('Laravel\Passport\PersonalAccessClient', PersonalAccessClient::class);
30-
class_alias('Laravel\Passport\Token', Token::class);
31-
class_alias('Laravel\Passport\RefreshToken', RefreshToken::class);
32-
}
22+
Passport::useAuthCodeModel(AuthCode::class);
23+
Passport::useClientModel(Client::class);
24+
Passport::usePersonalAccessClientModel(PersonalAccessClient::class);
25+
Passport::useTokenModel(Token::class);
26+
27+
$this->app->bind(PassportRefreshTokenRepository::class, function () {
28+
return $this->app->make(RefreshTokenRepository::class);
29+
});
3330
}
3431
}

src/Passport/Bridge/RefreshToken.php

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
3+
namespace DesignMyNight\Mongodb\Passport\Bridge;
4+
5+
use Jenssegers\Mongodb\Eloquent\Model;
6+
use League\OAuth2\Server\Entities\RefreshTokenEntityInterface;
7+
use League\OAuth2\Server\Entities\Traits\EntityTrait;
8+
use League\OAuth2\Server\Entities\Traits\RefreshTokenTrait;
9+
10+
/**
11+
* Class RefreshToken
12+
* @package DesignMyNight\Mongodb\Passport\Bridge
13+
*/
14+
class RefreshToken extends Model implements RefreshTokenEntityInterface
15+
{
16+
use EntityTrait, RefreshTokenTrait;
17+
18+
/**
19+
* @var string[]
20+
*/
21+
protected $casts = [
22+
'revoked' => 'bool',
23+
];
24+
25+
/**
26+
* @var string[]
27+
*/
28+
protected $dates = ['expires_at'];
29+
30+
/**
31+
* @var array
32+
*/
33+
protected $guarded = [];
34+
35+
/**
36+
* @var bool
37+
*/
38+
public $incrementing = false;
39+
40+
/**
41+
* @var string
42+
*/
43+
protected $primaryKey = 'id';
44+
45+
/**
46+
* @var string
47+
*/
48+
protected $table = 'oauth_refresh_tokens';
49+
50+
/**
51+
* @var bool
52+
*/
53+
public $timestamps = false;
54+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
namespace DesignMyNight\Mongodb\Passport\Bridge;
4+
5+
use Laravel\Passport\Bridge\RefreshTokenRepository as BaseRefreshTokenRepository;
6+
use Laravel\Passport\Events\RefreshTokenCreated;
7+
use League\OAuth2\Server\Entities\RefreshTokenEntityInterface;
8+
9+
/**
10+
* Class RefreshTokenRepository
11+
* @package App\Passport\Bridge
12+
*/
13+
class RefreshTokenRepository extends BaseRefreshTokenRepository
14+
{
15+
/**
16+
* @inheritDoc
17+
*/
18+
public function getNewRefreshToken()
19+
{
20+
return new RefreshToken();
21+
}
22+
23+
/**
24+
* {@inheritdoc}
25+
*/
26+
public function isRefreshTokenRevoked($tokenId)
27+
{
28+
$refreshToken = $this->database->table('oauth_refresh_tokens')
29+
->where('id', $tokenId)->first();
30+
31+
return $refreshToken === null || $refreshToken['revoked'];
32+
}
33+
34+
/**
35+
* @param RefreshToken|RefreshTokenEntityInterface $refreshTokenEntity
36+
*/
37+
public function persistNewRefreshToken(RefreshTokenEntityInterface $refreshTokenEntity)
38+
{
39+
$refreshTokenEntity->newModelQuery()->create([
40+
'id' => $id = $refreshTokenEntity->getIdentifier(),
41+
'access_token_id' => $accessTokenId = $refreshTokenEntity->getAccessToken()->getIdentifier(),
42+
'revoked' => false,
43+
'expires_at' => $refreshTokenEntity->getExpiryDateTime(),
44+
]);
45+
46+
$this->events->dispatch(new RefreshTokenCreated($id, $accessTokenId));
47+
}
48+
}

0 commit comments

Comments
 (0)