oauth2-client/README.md

227 lines
11 KiB
Markdown
Raw Normal View History

2014-04-30 02:20:09 +04:00
# OAuth 2.0 Client
2013-03-15 15:26:41 +04:00
2015-03-11 17:20:17 +03:00
[![Build Status](https://travis-ci.org/thephpleague/oauth2-client.svg?branch=master)](https://travis-ci.org/thephpleague/oauth2-client)
[![Coverage Status](https://coveralls.io/repos/thephpleague/oauth2-client/badge.svg?branch=master)](https://coveralls.io/r/thephpleague/oauth2-client?branch=master)
[![Latest Stable Version](https://poser.pugx.org/league/oauth2-client/version.svg)](https://packagist.org/packages/league/oauth2-client)
[![Total Downloads](https://poser.pugx.org/league/oauth2-client/downloads.svg)](https://packagist.org/packages/league/oauth2-client)
2013-11-18 06:18:23 +04:00
This package makes it stupidly simple to integrate your application with OAuth 2.0 identity providers.
2014-04-30 06:03:22 +04:00
2014-04-30 02:20:09 +04:00
Everyone is used to seeing those "Connect with Facebook/Google/etc" buttons around the Internet and social network
integration is an important feature of most web-apps these days. Many of these sites use an Authentication and Authorization standard called OAuth 2.0.
2013-03-15 15:26:41 +04:00
2014-04-30 02:21:30 +04:00
It will work with any OAuth 2.0 provider (be it an OAuth 2.0 Server for your own API or Facebook) and provides support
for popular systems out of the box. This package abstracts out some of the subtle but important differences between various providers, handles access tokens and refresh tokens, and allows you easy access to profile information on these other sites.
2013-03-15 15:26:41 +04:00
This package is compliant with [PSR-1][], [PSR-2][] and [PSR-4][]. If you notice compliance oversights, please send
2014-04-30 02:20:09 +04:00
a patch via pull request.
2013-03-25 16:59:42 +04:00
2014-04-30 02:20:09 +04:00
[PSR-1]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md
[PSR-2]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md
[PSR-4]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md
## Requirements
The following versions of PHP are supported.
2014-04-30 02:20:09 +04:00
* PHP 5.4
* PHP 5.5
* PHP 5.6
* HHVM
2013-03-25 16:59:42 +04:00
## Usage
2014-04-30 02:20:09 +04:00
### Authorization Code Flow
2013-03-25 16:59:42 +04:00
```php
$provider = new League\OAuth2\Client\Provider\<ProviderName>([
'clientId' => 'XXXXXXXX',
'clientSecret' => 'XXXXXXXX',
'redirectUri' => 'https://your-registered-redirect-uri/',
'scopes' => ['email', '...', '...'],
]);
2013-03-25 16:59:42 +04:00
if (!isset($_GET['code'])) {
2013-03-25 16:59:42 +04:00
2014-04-30 02:20:09 +04:00
// If we don't have an authorization code then get one
$authUrl = $provider->getAuthorizationUrl();
$_SESSION['oauth2state'] = $provider->state;
header('Location: '.$authUrl);
2014-04-30 02:20:09 +04:00
exit;
2013-03-25 16:59:42 +04:00
// Check given state against previously stored one to mitigate CSRF attack
} elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {
unset($_SESSION['oauth2state']);
exit('Invalid state');
2013-03-25 16:59:42 +04:00
} else {
// Try to get an access token (using the authorization code grant)
2014-04-30 02:20:09 +04:00
$token = $provider->getAccessToken('authorization_code', [
'code' => $_GET['code']
2014-04-30 02:20:09 +04:00
]);
2013-03-25 16:59:42 +04:00
2014-04-30 02:20:09 +04:00
// Optional: Now you have a token you can look up a users profile data
try {
2013-03-25 16:59:42 +04:00
2014-04-30 02:20:09 +04:00
// We got an access token, let's now get the user's details
$userDetails = $provider->getUserDetails($token);
2013-03-25 16:59:42 +04:00
2014-04-30 02:20:09 +04:00
// Use these details to create a new profile
printf('Hello %s!', $userDetails->firstName);
2013-03-25 16:59:42 +04:00
} catch (Exception $e) {
2014-04-30 02:20:09 +04:00
// Failed to get user details
exit('Oh dear...');
2013-03-25 16:59:42 +04:00
}
2014-04-30 02:20:09 +04:00
// Use this to interact with an API on the users behalf
echo $token->accessToken;
2014-04-30 02:20:09 +04:00
// Use this to get a new access token if the old one expires
echo $token->refreshToken;
2014-04-30 01:53:42 +04:00
2014-04-30 02:20:09 +04:00
// Number of seconds until the access token will expire, and need refreshing
echo $token->expires;
2014-04-30 02:20:09 +04:00
}
```
2014-04-30 01:53:42 +04:00
2014-04-30 02:20:09 +04:00
### Refreshing a Token
2014-04-30 01:53:42 +04:00
2014-04-30 02:20:09 +04:00
```php
$provider = new League\OAuth2\Client\Provider\<ProviderName>([
'clientId' => 'XXXXXXXX',
'clientSecret' => 'XXXXXXXX',
'redirectUri' => 'https://your-registered-redirect-uri/',
]);
2014-04-30 01:53:42 +04:00
2014-04-30 02:20:09 +04:00
$grant = new \League\OAuth2\Client\Grant\RefreshToken();
$token = $provider->getAccessToken($grant, ['refresh_token' => $refreshToken]);
```
2014-04-30 01:53:42 +04:00
## Providers
2014-05-12 18:01:32 +04:00
All providers must extend [AbstractProvider](https://github.com/thephpleague/oauth2-client/blob/master/src/Provider/AbstractProvider.php), and implement the declared abstract methods.
2014-05-12 18:01:32 +04:00
The following providers are available:
2014-05-12 18:01:32 +04:00
### Official providers
2014-05-12 18:01:32 +04:00
These are as many OAuth 2 services as we plan to support officially. Maintaining a wide selection of providers
damages our ability to make this package the best it can be, especially as we progress towards v1.0.
Gateway | Composer Package | Maintainer
--- | --- | ---
[Facebook](https://github.com/thephpleague/oauth2-facebook) | league/oauth2-facebook | [Sammy Kaye Powers](https://github.com/sammyk)
[Github](https://github.com/thephpleague/oauth2-client) | league/oauth2-client | [The League](https://github.com/thephpleague)
[Google](https://github.com/thephpleague/oauth2-google) | league/oauth2-google | [Woody Gilk](https://github.com/shadowhand)
[Instagram](https://github.com/thephpleague/oauth2-instagram) | league/oauth2-instagram | [Steven Maguire](https://github.com/stevenmaguire)
[LinkedIn](https://github.com/thephpleague/oauth2-linkedin) | league/oauth2-linkedin | [Steven Maguire](https://github.com/stevenmaguire)
### Third party providers
2014-05-12 18:01:32 +04:00
If you would like to support other providers, please make them available as a Composer package, then link to them
below.
These providers allow integration with other providers not supported by `oauth2-client`. They may require an older version
so please help them out with a pull request if you notice this.
Gateway | Composer Package | Maintainer
--- | --- | ---
[Battle.net](https://github.com/tpavlek/oauth2-bnet) | depotwarehouse/oauth2-bnet | [Troy Pavlek](https://github.com/tpavlek)
[Dropbox](https://github.com/pixelfear/oauth2-dropbox) | pixelfear/oauth2-dropbox | [Jason Varga](https://github.com/jasonvarga)
[Eventbrite](https://github.com/stevenmaguire/oauth2-eventbrite) | stevenmaguire/oauth2-eventbrite | [Steven Maguire](https://github.com/stevenmaguire)
[FreeAgent](https://github.com/CloudManaged/oauth2-freeagent) | cloudmanaged/oauth2-freeagent | [Israel Sotomayor](https://github.com/zot24)
[Google Nest](https://github.com/JC5/nest-oauth2-provider) | grumpydictator/nest-oauth2-provider | [James Cole](https://github.com/JC5)
[Mail.ru](https://packagist.org/packages/aego/oauth2-mailru) | aego/oauth2-mailru | [Alexey](https://github.com/rakeev)
[Meetup](https://github.com/howlowck/meetup-oauth2-provider) | howlowck/meetup-oauth2-provider | [Hao Luo](https://github.com/howlowck)
[Microsoft](https://github.com/stevenmaguire/oauth2-microsoft) | stevenmaguire/oauth2-microsoft | [Steven Maguire](https://github.com/stevenmaguire)
[Naver](https://packagist.org/packages/deminoth/oauth2-naver) | deminoth/oauth2-naver | [SangYeob Bono Yu](https://github.com/deminoth)
[Odnoklassniki](https://packagist.org/packages/aego/oauth2-odnoklassniki) | aego/oauth2-odnoklassniki | [Alexey](https://github.com/rakeev)
[Square](https://packagist.org/packages/wheniwork/oauth2-square) | wheniwork/oauth2-square | [Woody Gilk](https://github.com/shadowhand)
[Twitch.tv](https://github.com/tpavlek/oauth2-twitch) | depotwarehouse/oauth2-twitch | [Troy Pavlek](https://github.com/tpavlek)
2015-03-23 22:59:00 +03:00
[Uber](https://github.com/stevenmaguire/oauth2-uber) | stevenmaguire/oauth2-uber | [Steven Maguire](https://github.com/stevenmaguire)
[Vkontakte](https://github.com/j4k/oauth2-vkontakte) | j4k/oauth2-vkontakte | [Jack W](https://github.com/j4k)
2015-03-23 22:59:00 +03:00
[Yandex](https://packagist.org/packages/aego/oauth2-yandex) | aego/oauth2-yandex | [Alexey](https://github.com/rakeev)
[ZenPayroll](https://packagist.org/packages/wheniwork/oauth2-zenpayroll) | wheniwork/oauth2-zenpayroll | [Woody Gilk](https://github.com/shadowhand)
### Build your own providers
New providers can be created by cloning the layout of an existing package. When choosing a name for your package, please dont use the `league` vendor prefix, as this implies that it is officially supported.
You should use your own username as the vendor prefix, and prepend `oauth2-` to the package name to make it clear that your package works with OAuth2 Client. For example, if your GitHub username was santa, and you were implementing the giftpay OAuth2 library, a good name for your composer package would be `santa/oauth2-giftpay`.
#### Implementing your own provider
If you are working with an oauth2 service not supported out-of-the-box or by an existing package, it is quite simple to implement your own. Simply extend `League\OAuth2\Client\Provider\AbstractProvider` and implement the required abstract methods:
```php
abstract public function urlAuthorize();
abstract public function urlAccessToken();
abstract public function urlUserDetails(\League\OAuth2\Client\Token\AccessToken $token);
abstract public function userDetails($response, \League\OAuth2\Client\Token\AccessToken $token);
```
Each of these abstract methods contain a docblock defining their expectations and typical behaviour. Once you have
extended this class, you can simply follow the example above using your new `Provider`.
#### Custom account identifiers in access token responses
Some OAuth2 Server implementations include a field in their access token response defining some identifier
for the user account that just requested the access token. In many cases this field, if present, is called "uid", but
some providers define custom identifiers in their response. If your provider uses a nonstandard name for the "uid" field,
when extending the AbstractProvider, in your new class, define a property `public $uidKey` and set it equal to whatever
your provider uses as its key. For example, Battle.net uses `accountId` as the key for the identifier field, so in that
provider you would add a property:
```php
public $uidKey = 'accountId';
```
#### Make your gateway official
If you want to transfer your provider to the `thephpleague` GitHub organization and add it to the list of officially supported providers, please open a pull request on the thephpleague/oauth2-client package. Before new providers will be accepted, they must have 100% unit test code coverage, and follow the conventions and code style used in other OAuth2 Client providers.
## Client Packages
2014-05-12 18:01:32 +04:00
Some developers use this library as a base for their own PHP API wrappers, and that seems like a really great idea. It might make it slightly tricky to integrate their provider with an existing generic "OAuth 2.0 All the Things" login system, but it does make working with them easier.
- [Sniply](https://github.com/younes0/sniply)
## Install
Via Composer
``` bash
$ composer require league/oauth2-client
2014-05-12 18:01:32 +04:00
```
2014-04-30 02:20:09 +04:00
## Testing
2014-04-30 01:53:42 +04:00
2014-04-30 02:20:09 +04:00
``` bash
$ ./vendor/bin/phpunit
2014-04-30 02:20:09 +04:00
```
2013-11-18 06:18:44 +04:00
2014-05-20 12:34:52 +04:00
## Contributing
Please see [CONTRIBUTING](https://github.com/thephpleague/oauth2-client/blob/master/CONTRIBUTING.md) for details.
## Credits
- [Alex Bilbie](https://github.com/alexbilbie)
- [Ben Corlett](https://github.com/bencorlett)
- [James Mills](https://github.com/jamesmills)
- [Phil Sturgeon](https://github.com/philsturgeon)
- [Tom Anderson](https://github.com/TomHAnderson)
- [All Contributors](https://github.com/thephpleague/oauth2-client/contributors)
2013-11-18 06:18:44 +04:00
## License
2014-01-23 07:39:53 +04:00
The MIT License (MIT). Please see [License File](https://github.com/thephpleague/oauth2-client/blob/master/LICENSE) for more information.