Merge pull request #232 from shadowhand/provider-get-headers

Enhance ability to use client to make authenticated requests
oauth1test 0.10.0
Ben Ramsey 2015-03-10 16:23:08 -05:00
commit 76af6059fb
10 changed files with 90 additions and 38 deletions

View File

@ -31,7 +31,9 @@ abstract class AbstractProvider implements ProviderInterface
public $responseType = 'json';
public $headers = null;
public $headers = [];
public $authorizationHeader;
/**
* @var GuzzleClient
@ -323,17 +325,19 @@ abstract class AbstractProvider implements ProviderInterface
{
$url = $this->urlUserDetails($token);
return $this->fetchProviderData($url);
$headers = $this->getHeaders($token);
return $this->fetchProviderData($url, $headers);
}
protected function fetchProviderData($url)
protected function fetchProviderData($url, array $headers = [])
{
try {
$client = $this->getHttpClient();
$client->setBaseUrl($url);
if ($this->headers) {
$client->setDefaultOption('headers', $this->headers);
if ($headers) {
$client->setDefaultOption('headers', $headers);
}
$request = $client->get()->send();
@ -348,6 +352,23 @@ abstract class AbstractProvider implements ProviderInterface
return $response;
}
protected function getAuthorizationHeaders($token)
{
$headers = [];
if ($this->authorizationHeader) {
$headers['Authorization'] = $this->authorizationHeader . ' ' . $token;
}
return $headers;
}
public function getHeaders($token = null)
{
$headers = $this->headers;
if ($token) {
$headers = array_merge($headers, $this->getAuthorizationHeaders($token));
}
return $headers;
}
public function setRedirectHandler(Closure $handler)
{

View File

@ -6,13 +6,7 @@ use League\OAuth2\Client\Entity\User;
class Eventbrite extends AbstractProvider
{
public function __construct($options)
{
parent::__construct($options);
$this->headers = [
'Authorization' => 'Bearer',
];
}
public $authorizationHeader = 'Bearer';
public function urlAuthorize()
{
@ -26,7 +20,7 @@ class Eventbrite extends AbstractProvider
public function urlUserDetails(\League\OAuth2\Client\Token\AccessToken $token)
{
return 'https://www.eventbrite.com/json/user_get?access_token='.$token;
return 'https://www.eventbrite.com/json/user_get';
}
public function userDetails($response, \League\OAuth2\Client\Token\AccessToken $token)

View File

@ -3,11 +3,14 @@
namespace League\OAuth2\Client\Provider;
use League\OAuth2\Client\Entity\User;
use League\OAuth2\Client\Token\AccessToken;
class Github extends AbstractProvider
{
public $responseType = 'string';
public $authorizationHeader = 'token';
public $domain = 'https://github.com';
public $apiDomain = 'https://api.github.com';
@ -22,23 +25,23 @@ class Github extends AbstractProvider
return $this->domain.'/login/oauth/access_token';
}
public function urlUserDetails(\League\OAuth2\Client\Token\AccessToken $token)
public function urlUserDetails(AccessToken $token)
{
if ($this->domain === 'https://github.com') {
return $this->apiDomain.'/user?access_token='.$token;
return $this->apiDomain.'/user';
}
return $this->domain.'/api/v3/user?access_token='.$token;
return $this->domain.'/api/v3/user';
}
public function urlUserEmails(\League\OAuth2\Client\Token\AccessToken $token)
public function urlUserEmails(AccessToken $token)
{
if ($this->domain === 'https://github.com') {
return $this->apiDomain.'/user/emails?access_token='.$token;
return $this->apiDomain.'/user/emails';
}
return $this->domain.'/api/v3/user/emails?access_token='.$token;
return $this->domain.'/api/v3/user/emails';
}
public function userDetails($response, \League\OAuth2\Client\Token\AccessToken $token)
public function userDetails($response, AccessToken $token)
{
$user = new User();
@ -58,37 +61,39 @@ class Github extends AbstractProvider
return $user;
}
public function userUid($response, \League\OAuth2\Client\Token\AccessToken $token)
public function userUid($response, AccessToken $token)
{
return $response->id;
}
public function getUserEmails(\League\OAuth2\Client\Token\AccessToken $token)
public function getUserEmails(AccessToken $token)
{
$response = $this->fetchUserEmails($token);
return $this->userEmails(json_decode($response), $token);
}
public function userEmail($response, \League\OAuth2\Client\Token\AccessToken $token)
public function userEmail($response, AccessToken $token)
{
return isset($response->email) && $response->email ? $response->email : null;
}
public function userEmails($response, \League\OAuth2\Client\Token\AccessToken $token)
public function userEmails($response, AccessToken $token)
{
return $response;
}
public function userScreenName($response, \League\OAuth2\Client\Token\AccessToken $token)
public function userScreenName($response, AccessToken $token)
{
return $response->name;
}
protected function fetchUserEmails(\League\OAuth2\Client\Token\AccessToken $token)
protected function fetchUserEmails(AccessToken $token)
{
$url = $this->urlUserEmails($token);
return $this->fetchProviderData($url);
$headers = $this->getHeaders($token);
return $this->fetchProviderData($url, $headers);
}
}

View File

@ -13,6 +13,8 @@ class Google extends AbstractProvider
'email',
];
public $authorizationHeader = 'OAuth';
/**
* @var string If set, this will be sent to google as the "hd" parameter.
* @link https://developers.google.com/accounts/docs/OAuth2Login#hd-param
@ -60,7 +62,7 @@ class Google extends AbstractProvider
return
'https://www.googleapis.com/plus/v1/people/me?'.
'fields=id%2Cname(familyName%2CgivenName)%2CdisplayName%2C'.
'emails%2Fvalue%2Cimage%2Furl&alt=json&access_token='.$token;
'emails%2Fvalue%2Cimage%2Furl&alt=json';
}
public function userDetails($response, \League\OAuth2\Client\Token\AccessToken $token)

View File

@ -9,6 +9,7 @@ class LinkedIn extends AbstractProvider
{
public $scopes = ['r_basicprofile r_emailaddress r_contactinfo'];
public $responseType = 'json';
public $authorizationHeader = 'Bearer';
public $fields = [
'id', 'email-address', 'first-name', 'last-name', 'headline',
'location', 'industry', 'picture-url', 'public-profile-url',
@ -26,8 +27,8 @@ class LinkedIn extends AbstractProvider
public function urlUserDetails(AccessToken $token)
{
return 'https://api.linkedin.com/v1/people/~:('.implode(",", $this->fields)
.')?format=json&oauth2_access_token='.$token;
$fields = implode(',', $this->fields);
return 'https://api.linkedin.com/v1/people/~:(' . $fields . ')?format=json';
}
public function userDetails($response, AccessToken $token)

View File

@ -24,6 +24,8 @@ interface ProviderInterface
public function getAccessToken($grant = 'authorization_code', $params = []);
public function getHeaders($token = null);
public function getUserDetails(AccessToken $token);
public function getUserUid(AccessToken $token);

View File

@ -69,6 +69,7 @@ class AbstractProviderTest extends \PHPUnit_Framework_TestCase
'scopeSeparator' => ';',
'responseType' => 'csv',
'headers' => ['Foo' => 'Bar'],
'authorizationHeader' => 'Bearer',
];
$mockProvider = new MockProvider($options);
@ -142,6 +143,32 @@ class AbstractProviderTest extends \PHPUnit_Framework_TestCase
[$response3],
];
}
public function getHeadersTest()
{
$provider = $this->getMockForAbstractClass(
'\League\OAuth2\Client\Provider\AbstractProvider',
[
[
'clientId' => 'mock_client_id',
'clientSecret' => 'mock_secret',
'redirectUri' => 'none',
]
]
);
/**
* @var $provider AbstractProvider
*/
$this->assertEquals([], $provider->getHeaders());
$this->assertEquals([], $provider->getHeaders('mock_token'));
$provider->authorizationHeader = 'Bearer';
$this->assertEquals(['Authorization' => 'Bearer abc'], $provider->getHeaders('abc'));
$token = new AccessToken(['access_token' => 'xyz', 'expires_in' => 3600]);
$this->assertEquals(['Authorization' => 'Bearer xyz'], $provider->getHeaders($token));
}
}
class MockProvider extends \League\OAuth2\Client\Provider\AbstractProvider

View File

@ -102,6 +102,7 @@ class GithubTest extends \PHPUnit_Framework_TestCase
$client = m::mock('Guzzle\Service\Client');
$client->shouldReceive('setBaseUrl')->times(5);
$client->shouldReceive('setDefaultOption')->times(4);
$client->shouldReceive('post->send')->times(1)->andReturn($postResponse);
$client->shouldReceive('get->send')->times(4)->andReturn($getResponse);
$this->provider->setHttpClient($client);
@ -128,8 +129,8 @@ class GithubTest extends \PHPUnit_Framework_TestCase
$this->assertEquals($this->provider->domain.'/login/oauth/authorize', $this->provider->urlAuthorize());
$this->assertEquals($this->provider->domain.'/login/oauth/access_token', $this->provider->urlAccessToken());
$this->assertEquals($this->provider->apiDomain.'/user?access_token=mock_access_token', $this->provider->urlUserDetails($token));
$this->assertEquals($this->provider->apiDomain.'/user/emails?access_token=mock_access_token', $this->provider->urlUserEmails($token));
$this->assertEquals($this->provider->apiDomain.'/user', $this->provider->urlUserDetails($token));
$this->assertEquals($this->provider->apiDomain.'/user/emails', $this->provider->urlUserEmails($token));
}
public function testGithubEnterpriseDomainUrls()
@ -147,8 +148,8 @@ class GithubTest extends \PHPUnit_Framework_TestCase
$this->assertEquals($this->provider->domain.'/login/oauth/authorize', $this->provider->urlAuthorize());
$this->assertEquals($this->provider->domain.'/login/oauth/access_token', $this->provider->urlAccessToken());
$this->assertEquals($this->provider->domain.'/api/v3/user?access_token=mock_access_token', $this->provider->urlUserDetails($token));
$this->assertEquals($this->provider->domain.'/api/v3/user/emails?access_token=mock_access_token', $this->provider->urlUserEmails($token));
$this->assertEquals($this->provider->domain.'/api/v3/user', $this->provider->urlUserDetails($token));
$this->assertEquals($this->provider->domain.'/api/v3/user/emails', $this->provider->urlUserEmails($token));
}
public function testUserEmails()
@ -161,6 +162,7 @@ class GithubTest extends \PHPUnit_Framework_TestCase
$client = m::mock('Guzzle\Service\Client');
$client->shouldReceive('setBaseUrl')->times(2);
$client->shouldReceive('setDefaultOption')->times(1);
$client->shouldReceive('post->send')->times(1)->andReturn($postResponse);
$client->shouldReceive('get->send')->times(1)->andReturn($getResponse);
$this->provider->setHttpClient($client);

View File

@ -62,8 +62,6 @@ class GoogleTest extends \PHPUnit_Framework_TestCase
$token = $this->provider->getAccessToken('authorization_code', ['code' => 'mock_authorization_code']);
# print_r($token);die();
$this->assertEquals('mock_access_token', $token->accessToken);
$this->assertLessThanOrEqual(time() + 3600, $token->expires);
$this->assertGreaterThanOrEqual(time(), $token->expires);
@ -86,6 +84,7 @@ class GoogleTest extends \PHPUnit_Framework_TestCase
$client = m::mock('Guzzle\Service\Client');
$client->shouldReceive('setBaseUrl')->times(5);
$client->shouldReceive('setDefaultOption')->times(4);
$client->shouldReceive('post->send')->times(1)->andReturn($postResponse);
$client->shouldReceive('get->send')->times(4)->andReturn($getResponse);
$this->provider->setHttpClient($client);

View File

@ -58,8 +58,6 @@ class LinkedInTest extends \PHPUnit_Framework_TestCase
$token = $this->provider->getAccessToken('authorization_code', ['code' => 'mock_authorization_code']);
# print_r($token);die();
$this->assertEquals('mock_access_token', $token->accessToken);
$this->assertLessThanOrEqual(time() + 3600, $token->expires);
$this->assertGreaterThanOrEqual(time(), $token->expires);
@ -82,6 +80,7 @@ class LinkedInTest extends \PHPUnit_Framework_TestCase
$client = m::mock('Guzzle\Service\Client');
$client->shouldReceive('setBaseUrl')->times(5);
$client->shouldReceive('setDefaultOption')->times(4);
$client->shouldReceive('post->send')->times(1)->andReturn($postResponse);
$client->shouldReceive('get->send')->times(4)->andReturn($getResponse);
$this->provider->setHttpClient($client);