Initial revision supporting obtaining bearer authentication tokens
This commit is contained in:
commit
bbbdff040f
29
composer.json
Normal file
29
composer.json
Normal file
@ -0,0 +1,29 @@
|
||||
{
|
||||
"name": "leenooks/intuit",
|
||||
"description": "Intuit API",
|
||||
"keywords": ["laravel","leenooks","intuit"],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Deon George",
|
||||
"email": "deon@leenooks.net"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"jenssegers/model": "^1.5"
|
||||
},
|
||||
"require-dev": {
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Intuit\\": "src"
|
||||
}
|
||||
},
|
||||
"extra": {
|
||||
"laravel": {
|
||||
"providers": [
|
||||
"Intuit\\Providers\\IntuitServiceProvider"
|
||||
]
|
||||
}
|
||||
},
|
||||
"minimum-stability": "dev"
|
||||
}
|
36
src/Providers/IntuitServiceProvider.php
Normal file
36
src/Providers/IntuitServiceProvider.php
Normal file
@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace Intuit\Providers;
|
||||
|
||||
use Illuminate\Routing\Router;
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
|
||||
/**
|
||||
* Class IntuitServiceProvider.
|
||||
*/
|
||||
class IntuitServiceProvider extends ServiceProvider
|
||||
{
|
||||
private string $_path = '';
|
||||
|
||||
/**
|
||||
* Bootstrap the application services.
|
||||
*
|
||||
* @param Router $router
|
||||
*/
|
||||
public function boot(Router $router)
|
||||
{
|
||||
$this->mergeConfigFrom($this->_path.'/config/intuit.php','intuit');
|
||||
}
|
||||
|
||||
/**
|
||||
* Register the application services.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function register()
|
||||
{
|
||||
if (! $this->_path) {
|
||||
$this->_path = realpath(__DIR__.'/../../src');
|
||||
}
|
||||
}
|
||||
}
|
82
src/Providers/Socialite/IntuitProvider.php
Normal file
82
src/Providers/Socialite/IntuitProvider.php
Normal file
@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
namespace Intuit\Providers\Socialite;
|
||||
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Laravel\Socialite\Two\InvalidStateException;
|
||||
use Laravel\Socialite\Two\ProviderInterface;
|
||||
use Laravel\Socialite\Two\AbstractProvider;
|
||||
use Laravel\Socialite\Two\User as SocialUser;
|
||||
|
||||
class IntuitProvider extends AbstractProvider implements ProviderInterface
|
||||
{
|
||||
private const hosts = [
|
||||
'authorise' => 'https://appcenter.intuit.com/connect/oauth2',
|
||||
'accesstoken' => 'https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer',
|
||||
'local' => 'https://sandbox-quickbooks.api.intuit.com',
|
||||
'production' => 'https://quickbooks.api.intuit.com',
|
||||
];
|
||||
protected $scopes = ['com.intuit.quickbooks.accounting'];
|
||||
|
||||
/* ABSTRACT */
|
||||
|
||||
protected function getAuthUrl($state)
|
||||
{
|
||||
return $this->buildAuthUrlFromBase(
|
||||
Arr::get(self::hosts,'authorise'),
|
||||
$state
|
||||
);
|
||||
}
|
||||
|
||||
protected function getUserByToken($token)
|
||||
{
|
||||
$response = [];
|
||||
|
||||
$access = $this->getAccessTokenResponse($token);
|
||||
|
||||
if ((! $x=Arr::get($access,'token_type')) || ($x !== 'bearer')) {
|
||||
$response['reject'] = TRUE;
|
||||
$response['reject_reason'] = 'No bearer token?';
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
return $response ?: $access;
|
||||
}
|
||||
|
||||
protected function getTokenUrl()
|
||||
{
|
||||
return Arr::get(self::hosts,'accesstoken');
|
||||
}
|
||||
|
||||
protected function mapUserToObject(array $user)
|
||||
{
|
||||
return (new SocialUser)->setRaw(Auth::user()->toArray());
|
||||
}
|
||||
|
||||
/* OVERRIDES */
|
||||
|
||||
public function user()
|
||||
{
|
||||
if ($this->hasInvalidState()) {
|
||||
throw new InvalidStateException;
|
||||
}
|
||||
|
||||
if (! $this->getCode())
|
||||
return NULL;
|
||||
|
||||
$details = $this->getUserByToken($this->getCode());
|
||||
|
||||
if ((! $details) || Arr::get($details,'reject'))
|
||||
abort(403, sprintf('Authentication Failed with %s',Arr::get($details,'reject_reason','*no reason given*')));
|
||||
|
||||
$user = $this->mapUserToObject($details);
|
||||
$user->refresh_token_expires_in = Arr::get($details,'x_refresh_token_expires_in');
|
||||
$user->realmid = $this->request->get('realmId');
|
||||
|
||||
return $user->setToken(Arr::get($details,'access_token'))
|
||||
->setRefreshToken(Arr::get($details,'refresh_token'))
|
||||
->setExpiresIn(Arr::get($details,'expires_in'));
|
||||
}
|
||||
}
|
23
src/Traits/IntuitSocialite.php
Normal file
23
src/Traits/IntuitSocialite.php
Normal file
@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Setup for Intuit authentication
|
||||
*/
|
||||
namespace Intuit\Traits;
|
||||
|
||||
use Illuminate\Support\Arr;
|
||||
use Intuit\Providers\Socialite\IntuitProvider;
|
||||
|
||||
trait IntuitSocialite
|
||||
{
|
||||
private function bootIntuitSocialite()
|
||||
{
|
||||
$socialite = $this->app->make('Laravel\Socialite\Contracts\Factory');
|
||||
|
||||
$socialite->extend('intuit', function ($app) use ($socialite) {
|
||||
$config = Arr::get($app,'config.intuit');
|
||||
|
||||
return $socialite->buildProvider(IntuitProvider::class, $config);
|
||||
});
|
||||
}
|
||||
}
|
7
src/config/intuit.php
Normal file
7
src/config/intuit.php
Normal file
@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'client_id' => env('AUTH_INTUIT_CLIENT_ID'),
|
||||
'client_secret' => env('AUTH_INTUIT_SECRET_KEY'),
|
||||
'redirect' => '/auth/intuit/token',
|
||||
];
|
Loading…
Reference in New Issue
Block a user