Skip to content

Commit 8dca72d

Browse files
committed
added an refresh token before it expire
1 parent 017261c commit 8dca72d

File tree

3 files changed

+75
-8
lines changed

3 files changed

+75
-8
lines changed

src/Auth/TokenInfo.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,13 @@ class TokenInfo
1313
*/
1414
protected $expiresAt;
1515

16+
private $refreshAt;
17+
1618
public function __construct(string $token, int $expiresAt)
1719
{
1820
$this->token = $token;
1921
$this->expiresAt = $expiresAt;
22+
$this->refreshAt = time() + 0.1*($this->expiresAt-time());
2023
}
2124

2225
/**
@@ -34,4 +37,9 @@ public function getToken(): string
3437
{
3538
return $this->token;
3639
}
40+
41+
public function getRefreshAt(): int
42+
{
43+
return $this->refreshAt;
44+
}
3745
}

src/Iam.php

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ class Iam implements IamTokenContract
4545
*/
4646
protected $logger;
4747

48+
/**
49+
* @var int
50+
*/
51+
protected $refresh_at;
52+
4853
/**
4954
* @param array $config
5055
* @param LoggerInterface|null $logger
@@ -96,9 +101,11 @@ public function newToken()
96101
$tokenInfo = $this->config('credentials')->getTokenInfo();
97102
$this->iam_token = $tokenInfo->getToken();
98103
$this->expires_at = $tokenInfo->getExpiresAt();
104+
$this->refresh_at = $tokenInfo->getRefreshAt();
99105
$this->saveToken((object)[
100106
"iamToken" => $tokenInfo->getToken(),
101107
"expiresAt" => $tokenInfo->getExpiresAt(),
108+
"refreshAt" => $tokenInfo->getRefreshAt()
102109
]);
103110
return $tokenInfo->getToken();
104111
}
@@ -347,7 +354,14 @@ protected function loadToken()
347354
{
348355
if ($this->iam_token)
349356
{
350-
if ($this->expires_at > time())
357+
if ($this->refresh_at < time()){
358+
try {
359+
return $this->newToken();
360+
} catch (\Exception $e){
361+
return $this->iam_token;
362+
}
363+
}
364+
else if ($this->expires_at > time())
351365
{
352366
return $this->iam_token;
353367
}
@@ -372,6 +386,7 @@ protected function loadTokenFromFile()
372386
{
373387
$this->iam_token = $token->iamToken;
374388
$this->expires_at = $token->expiresAt;
389+
$this->refresh_at = $token->refreshAt ?? $token->expiresAt;
375390
$this->logger()->info('YDB: Reused IAM token [...' . substr($this->iam_token, -6) . '].');
376391
return $token->iamToken;
377392
}
@@ -390,10 +405,12 @@ protected function saveToken($token)
390405

391406
$this->iam_token = $token->iamToken;
392407
$this->expires_at = $this->convertExpiresAt($token->expiresAt ?? '');
408+
$this->refresh_at = $token->refreshAt;
393409

394410
file_put_contents($tokenFile, json_encode([
395411
'iamToken' => $this->iam_token,
396412
'expiresAt' => $this->expires_at,
413+
'refreshAt' => $this->refresh_at
397414
]));
398415
}
399416

tests/RefreshTokenTest.php

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,30 @@
77
use YdbPlatform\Ydb\Auth\TokenInfo;
88
use YdbPlatform\Ydb\Ydb;
99

10-
class TestCredentials extends Auth{
10+
class FakeCredentials extends Auth {
11+
12+
/**
13+
* @var int
14+
*/
15+
protected $counter;
16+
17+
public function __construct(&$counter)
18+
{
19+
$this->counter = &$counter;
20+
}
1121

1222
public function getTokenInfo(): TokenInfo
1323
{
14-
return new TokenInfo(time()+1,time()+1);
24+
$this->counter++;
25+
if ($this->counter==2){
26+
throw new \Exception("Some error");
27+
}
28+
return new TokenInfo(time()+3,time()+3);
1529
}
1630

1731
public function getName(): string
1832
{
19-
return "TestCredentials";
33+
return "FakeCredentials";
2034
}
2135
}
2236

@@ -30,7 +44,7 @@ class RefreshTokenTest extends TestCase
3044
{
3145
public function test(){
3246

33-
$i = 0;
47+
$counter = 0;
3448

3549
$config = [
3650

@@ -47,17 +61,45 @@ public function test(){
4761
'iam_config' => [
4862
'insecure' => true,
4963
],
50-
'credentials' => new TestCredentials()
64+
'credentials' => new FakeCredentials($counter)
5165
];
5266
$ydb = new Ydb($config);
5367
$table = $ydb->table();
5468
$session = $table->session();
55-
$token = MetaGetter::getMeta($session)["x-ydb-auth-ticket"];
69+
$token = MetaGetter::getMeta($session)["x-ydb-auth-ticket"][0];
70+
self::assertEquals(
71+
1,
72+
$counter
73+
);
74+
75+
$session->query('select 1 as res');
76+
self::assertEquals(
77+
$token,
78+
MetaGetter::getMeta($session)["x-ydb-auth-ticket"][0]
79+
);
80+
self::assertEquals(
81+
1,
82+
$counter
83+
);
84+
5685
usleep(1e6);
5786
$session->query('select 1 as res');
87+
self::assertEquals(
88+
2,
89+
$counter
90+
);
91+
self::assertEquals(
92+
$token,
93+
MetaGetter::getMeta($session)["x-ydb-auth-ticket"][0]
94+
);
95+
$session->query('select 1 as res');
96+
self::assertEquals(
97+
3,
98+
$counter
99+
);
58100
self::assertNotEquals(
59101
$token,
60-
MetaGetter::getMeta($session)["x-ydb-auth-ticket"]
102+
MetaGetter::getMeta($session)["x-ydb-auth-ticket"][0]
61103
);
62104
}
63105
}

0 commit comments

Comments
 (0)