Skip to content

Commit

Permalink
Fix: new refresh tokens were not saved after access tokens are refres…
Browse files Browse the repository at this point in the history
…hed via onError
  • Loading branch information
pjcdawkins committed Dec 12, 2015
1 parent 7cd2fa3 commit e6eac03
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 1 deletion.
4 changes: 3 additions & 1 deletion src/Oauth2Subscriber.php
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ public function onError(ErrorEvent $event)
if ($request->getConfig()->get('auth') == 'oauth2' && !$request->getConfig()->get('retried')) {
if ($token = $this->acquireAccessToken()) {
$this->accessToken = $token;
$this->refreshToken = $token->getRefreshToken();
$request->getConfig()->set('retried', true);
$event->intercept($event->getClient()->send($request));
}
Expand Down Expand Up @@ -122,7 +123,7 @@ public function getAccessToken()
// Try to acquire a new access token from the server.
$this->accessToken = $this->acquireAccessToken();
if ($this->accessToken) {
$this->refreshToken = $this->accessToken->getRefreshToken() ?: null;
$this->refreshToken = $this->accessToken->getRefreshToken();
}
}

Expand Down Expand Up @@ -154,6 +155,7 @@ public function setAccessToken($accessToken, $type = null, $expires = null)
throw new \InvalidArgumentException('Invalid access token');
}
$this->accessToken = $accessToken;
$this->refreshToken = $accessToken->getRefreshToken();
}

/**
Expand Down
1 change: 1 addition & 0 deletions tests/MockOAuth2Server.php
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ protected function validTokenResponse()
{
$token = [
'access_token' => 'testToken',
'refresh_token' => 'testRefreshTokenFromServer',
'token_type' => 'bearer',
];

Expand Down
41 changes: 41 additions & 0 deletions tests/OAuth2SubscriberTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,47 @@ public function testSubscriberUsesRefreshToken()
// Now, the access token should be valid.
$this->assertFalse($subscriber->getAccessToken()->isExpired());
$this->assertEquals(200, $response->getStatusCode());

// Also, the refresh token should have changed.
$newRefreshToken = $subscriber->getRefreshToken();
$this->assertEquals('testRefreshTokenFromServer', $newRefreshToken->getToken());
}

public function testNewRefreshTokenStoredAfterError()
{
$credentials = [
'client_id' => 'test',
'client_secret' => 'testSecret',
];

$accessTokenGrantType = new ClientCredentials($this->getClient(), $credentials);

$subscriber = new Oauth2Subscriber(
$accessTokenGrantType,
new RefreshToken($this->getClient(), $credentials)
);

// Use a access token that isn't expired on the client side, but
// the server thinks is expired. This should trigger the onError event
// in the subscriber, forcing it to try the refresh token grant type.
$subscriber->setAccessToken('testInvalidAccessToken');
$subscriber->setRefreshToken('testRefreshToken');
$client = $this->getClient([
'defaults' => [
'subscribers' => [$subscriber],
'auth' => 'oauth2',
],
]);

$response = $client->get('api/collection');

// Now, the access token should be valid.
$this->assertFalse($subscriber->getAccessToken()->isExpired());
$this->assertEquals(200, $response->getStatusCode());

// Also, the refresh token should have changed.
$newRefreshToken = $subscriber->getRefreshToken();
$this->assertEquals('testRefreshTokenFromServer', $newRefreshToken->getToken());
}

public function testSettingManualAccessToken()
Expand Down

0 comments on commit e6eac03

Please sign in to comment.