Swapped the oauth lib again
This commit is contained in:
parent
1f3650b98a
commit
4bd4625dd3
9 changed files with 48 additions and 369 deletions
|
@ -23,7 +23,7 @@
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=5.4",
|
"php": ">=5.4",
|
||||||
"league/oauth2-server": "4.0.x-dev"
|
"bshaffer/oauth2-server-php": "v1.5"
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"mongodb/mongo-php-driver": "Required to use the Mongo storage engine",
|
"mongodb/mongo-php-driver": "Required to use the Mongo storage engine",
|
||||||
|
|
|
@ -1,87 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Pickles\OAuth2;
|
|
||||||
|
|
||||||
use \League\OAuth2\Server\Entity\AbstractTokenEntity;
|
|
||||||
use \League\OAuth2\Server\Entity\AccessTokenEntity;
|
|
||||||
use \League\OAuth2\Server\Entity\ScopeEntity;
|
|
||||||
use \League\OAuth2\Server\Storage\AccessTokenInterface;
|
|
||||||
|
|
||||||
class AccessTokenStorage extends StorageAdapter implements AccessTokenInterface
|
|
||||||
{
|
|
||||||
public function get($token)
|
|
||||||
{
|
|
||||||
$sql = 'SELECT oauth_access_tokens.*'
|
|
||||||
. ' FROM oauth_access_tokens'
|
|
||||||
. ' WHERE access_token = ?'
|
|
||||||
. ' AND expires_at >= ?;';
|
|
||||||
|
|
||||||
$results = $this->db->fetch($sql, [$token, time()]);
|
|
||||||
|
|
||||||
if (count($results) === 1)
|
|
||||||
{
|
|
||||||
return (new AccessTokenEntity($this->server))
|
|
||||||
->setId($results[0]['access_token'])
|
|
||||||
->setExpireTime($results[0]['expires_at']);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getScopes(AbstractTokenEntity $token)
|
|
||||||
{
|
|
||||||
$response = [];
|
|
||||||
|
|
||||||
/*
|
|
||||||
@todo Port to Mongo
|
|
||||||
$sql = 'SELECT oauth_scopes.id, oauth_scopes.description'
|
|
||||||
. ' FROM oauth_access_token_scopes'
|
|
||||||
. ' INNER JOIN oauth_scopes'
|
|
||||||
. ' ON oauth_access_token_scopes.scope_id = oauth_scopes.id'
|
|
||||||
. ' WHERE oauth_access_token_scopes.access_token_id = ?;';
|
|
||||||
|
|
||||||
$results = $this->db->fetch($sql, [$token->getId()]);
|
|
||||||
|
|
||||||
if (count($results) > 0)
|
|
||||||
{
|
|
||||||
foreach ($results as $row)
|
|
||||||
{
|
|
||||||
$response[] = (new ScopeEntity($this->server))->hydrate([
|
|
||||||
'id' => $row['id'],
|
|
||||||
'description' => $row['description']
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
return $response;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function create($token, $expiration, $session_id)
|
|
||||||
{
|
|
||||||
return $this->mongo->oauth_access_tokens->insert([
|
|
||||||
'access_token' => $token,
|
|
||||||
'session_id' => $session_id, // @todo Store as MongoId?
|
|
||||||
'expires_at' => $expiration,
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function associateScope(AbstractTokenEntity $token, ScopeEntity $scope)
|
|
||||||
{
|
|
||||||
$sql = 'INSERT INTO oauth_access_token_scopes'
|
|
||||||
. ' (access_token, scope)'
|
|
||||||
. ' VALUES'
|
|
||||||
. ' (?, ?);';
|
|
||||||
|
|
||||||
$this->db->execute($sql, [$token->getId(), $scope->getId()]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function delete(AbstractTokenEntity $token)
|
|
||||||
{
|
|
||||||
$sql = 'DELETE FROM oauth_access_token_scopes'
|
|
||||||
. ' WHERE access_token = ?;';
|
|
||||||
|
|
||||||
$this->db->execute($sql, [$token->getId()]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,68 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Pickles\OAuth2;
|
|
||||||
|
|
||||||
use \League\OAuth2\Server\Entity\ClientEntity;
|
|
||||||
use \League\OAuth2\Server\Entity\SessionEntity;
|
|
||||||
use \League\OAuth2\Server\Storage\Adapter;
|
|
||||||
use \League\OAuth2\Server\Storage\ClientInterface;
|
|
||||||
|
|
||||||
class ClientStorage extends StorageAdapter implements ClientInterface
|
|
||||||
{
|
|
||||||
public function get($client_id, $client_secret = null, $redirect_uri = null, $grant_type = null)
|
|
||||||
{
|
|
||||||
$criteria = ['_id' => new \MongoId($client_id)];
|
|
||||||
|
|
||||||
if ($redirect_uri)
|
|
||||||
{
|
|
||||||
// @todo join / query oauth_client_redirect_uris
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($client_secret)
|
|
||||||
{
|
|
||||||
$criteria['secret'] = $client_secret;
|
|
||||||
}
|
|
||||||
|
|
||||||
$results = $this->mongo->oauth_clients->findOne($criteria);
|
|
||||||
|
|
||||||
if ($results)
|
|
||||||
{
|
|
||||||
$client = new ClientEntity($this->server);
|
|
||||||
|
|
||||||
$client->hydrate([
|
|
||||||
'id' => $results['_id']->{'$id'},
|
|
||||||
'name' => $results['name']
|
|
||||||
]);
|
|
||||||
|
|
||||||
return $client;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getBySession(SessionEntity $session)
|
|
||||||
{
|
|
||||||
$sql = 'SELECT oauth_clients.id, oauth_clients.name'
|
|
||||||
. ' FROM oauth_clients'
|
|
||||||
. ' INNER JOIN oauth_sessions'
|
|
||||||
. ' ON oauth_clients.id = oauth_sessions.client_id'
|
|
||||||
. ' WHERE oauth_sessions.id = ?';
|
|
||||||
|
|
||||||
$results = $this->db->fetch($sql, [$session->getId()]);
|
|
||||||
|
|
||||||
if (count($results) === 1)
|
|
||||||
{
|
|
||||||
$client = new ClientEntity($this->server);
|
|
||||||
|
|
||||||
$client->hydrate([
|
|
||||||
'id' => $results[0]['id'],
|
|
||||||
'name' => $results[0]['name']
|
|
||||||
]);
|
|
||||||
|
|
||||||
return $client;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,53 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Pickles\OAuth2;
|
|
||||||
|
|
||||||
use \League\OAuth2\Server\Entity\RefreshTokenEntity;
|
|
||||||
use \League\OAuth2\Server\Storage\RefreshTokenInterface;
|
|
||||||
|
|
||||||
class RefreshTokenStorage extends StorageAdapter implements RefreshTokenInterface
|
|
||||||
{
|
|
||||||
public function get($token)
|
|
||||||
{
|
|
||||||
$sql = 'SELECT oauth_refresh_tokens.*'
|
|
||||||
. ' FROM oauth_refresh_tokens'
|
|
||||||
. ' WHERE refresh_token = ?'
|
|
||||||
. ' AND expires_at >= ?;';
|
|
||||||
|
|
||||||
$results = $this->db->fetch($sql, [$token, time()]);
|
|
||||||
|
|
||||||
if (count($results) === 1)
|
|
||||||
{
|
|
||||||
return (new RefreshTokenEntity($this->server))
|
|
||||||
->setId($results[0]['refresh_token'])
|
|
||||||
->setExpireTime($results[0]['expires_at'])
|
|
||||||
->setAccessTokenId($results[0]['access_token_id']);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function create($token, $expiration, $access_token)
|
|
||||||
{
|
|
||||||
$results = $this->mongo->oauth_access_tokens->findOne([
|
|
||||||
'access_token' => $access_token,
|
|
||||||
]);
|
|
||||||
|
|
||||||
$token_id = $results['_id']->{'$id'};
|
|
||||||
|
|
||||||
return $this->mongo->oauth_refresh_tokens->insert([
|
|
||||||
'refresh_token' => $token,
|
|
||||||
'access_token_id' => $token_id,
|
|
||||||
'expires_at' => $expiration,
|
|
||||||
'client_id' => $this->server->getRequest()->request->get('client_id', null),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function delete(RefreshTokenEntity $token)
|
|
||||||
{
|
|
||||||
$sql = 'DELETE FROM oauth_refresh_tokens WHERE refresh_token = ?;';
|
|
||||||
|
|
||||||
$this->db->execute($sql, [$token->getId()]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -2,10 +2,9 @@
|
||||||
|
|
||||||
namespace Pickles\OAuth2;
|
namespace Pickles\OAuth2;
|
||||||
|
|
||||||
use \League\OAuth2\Exception\OAuthException;
|
use \OAuth2\GrantType\UserCredentials;
|
||||||
use \League\OAuth2\Server\AuthorizationServer;
|
use \OAuth2\Request;
|
||||||
use \League\OAuth2\Server\Grant\PasswordGrant;
|
use \OAuth2\Server;
|
||||||
use \League\OAuth2\Server\Grant\RefreshTokenGrant;
|
|
||||||
use \Pickles\Config;
|
use \Pickles\Config;
|
||||||
|
|
||||||
class Resource extends \Pickles\Resource
|
class Resource extends \Pickles\Resource
|
||||||
|
@ -28,6 +27,12 @@ class Resource extends \Pickles\Resource
|
||||||
case 'oauth/access_token':
|
case 'oauth/access_token':
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
$storage = new Storage($this->mongo, ['user_table' => 'user']);
|
||||||
|
$server = new Server($storage);
|
||||||
|
$server->addGrantType(new UserCredentials($storage));
|
||||||
|
$server->handleTokenRequest(Request::createFromGlobals())->send();
|
||||||
|
exit;
|
||||||
|
|
||||||
$server = new AuthorizationServer;
|
$server = new AuthorizationServer;
|
||||||
|
|
||||||
$server->setSessionStorage(new SessionStorage);
|
$server->setSessionStorage(new SessionStorage);
|
||||||
|
|
|
@ -1,26 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Pickles\OAuth2;
|
|
||||||
|
|
||||||
use \League\OAuth2\Server\Storage\Adapter;
|
|
||||||
use \League\OAuth2\Server\Storage\ScopeInterface;
|
|
||||||
|
|
||||||
class ScopeStorage extends StorageAdapter implements ScopeInterface
|
|
||||||
{
|
|
||||||
public function get($scope, $grant_type = null, $client_id = null)
|
|
||||||
{
|
|
||||||
$sql = 'SELECT * FROM oauth_scopes WHERE id = ?;';
|
|
||||||
$results = $this->db->fetch($sql, [$scope]);
|
|
||||||
|
|
||||||
if (count($results) === 0)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (new ScopeEntity($this->server))->hydrate([
|
|
||||||
'id' => $result[0]['id'],
|
|
||||||
'description' => $result[0]['description'],
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,110 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Pickles\OAuth2;
|
|
||||||
|
|
||||||
use \League\OAuth2\Server\Entity\AccessTokenEntity;
|
|
||||||
use \League\OAuth2\Server\Entity\AuthCodeEntity;
|
|
||||||
use \League\OAuth2\Server\Entity\ScopeEntity;
|
|
||||||
use \League\OAuth2\Server\Entity\SessionEntity;
|
|
||||||
use \League\OAuth2\Server\Storage\Adapter;
|
|
||||||
use \League\OAuth2\Server\Storage\SessionInterface;
|
|
||||||
|
|
||||||
class SessionStorage extends StorageAdapter implements SessionInterface
|
|
||||||
{
|
|
||||||
public function getByAccessToken(AccessTokenEntity $access_token)
|
|
||||||
{
|
|
||||||
$sql = 'SELECT oauth_sessions.id, oauth_sessions.owner_type,'
|
|
||||||
. ' oauth_sessions.owner_id, oauth_sessions.client_id,'
|
|
||||||
. ' oauth_sessions.client_redirect_uri'
|
|
||||||
. ' FROM oauth_sessions'
|
|
||||||
. ' INNER JOIN oauth_access_tokens'
|
|
||||||
. ' ON oauth_access_tokens.session_id = oauth_sessions.id'
|
|
||||||
. ' WHERE oauth_access_tokens.access_token = ?;';
|
|
||||||
|
|
||||||
$results = $this->db->fetch($sql, [$access_token->getId()]);
|
|
||||||
|
|
||||||
if (count($results) === 1)
|
|
||||||
{
|
|
||||||
$session = new SessionEntity($this->server);
|
|
||||||
$session->setId($result[0]['id']);
|
|
||||||
$session->setOwner($result[0]['owner_type'], $result[0]['owner_id']);
|
|
||||||
|
|
||||||
return $session;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getByAuthCode(AuthCodeEntity $auth_code)
|
|
||||||
{
|
|
||||||
$sql = 'SELECT oauth_sessions.id, oauth_sessions.owner_type,'
|
|
||||||
. ' oauth_sessions.owner_id, oauth_sessions.client_id,'
|
|
||||||
. ' oauth_sessions.client_redirect_uri'
|
|
||||||
. ' FROM oauth_sessions'
|
|
||||||
. ' INNER JOIN oauth_authorization_codes'
|
|
||||||
. ' ON oauth_authorization_codes.session_id = oauth_sessions.id'
|
|
||||||
. ' WHERE oauth_authorization_codes.authorization_code = ?;';
|
|
||||||
|
|
||||||
$results = $this->db->fetch($sql, [$auth_code->getId()]);
|
|
||||||
|
|
||||||
if (count($results) === 1)
|
|
||||||
{
|
|
||||||
$session = new SessionEntity($this->server);
|
|
||||||
$session->setId($result[0]['id']);
|
|
||||||
$session->setOwner($result[0]['owner_type'], $result[0]['owner_id']);
|
|
||||||
|
|
||||||
return $session;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getScopes(SessionEntity $session)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
// @todo
|
|
||||||
// INNER JOIN oauth_access_token_scopes
|
|
||||||
// ON oauth_sessions.id = oauth_access_token_scopes.access_token_id
|
|
||||||
// INNER JOIN oauth_scopes
|
|
||||||
// ON oauth_scopes.id = oauth_access_token_scopes.scope_id
|
|
||||||
|
|
||||||
$results = $this->mongo->oauth_sessions->findOne([
|
|
||||||
'_id' => new \MongoId($session->getId())
|
|
||||||
]);
|
|
||||||
|
|
||||||
$scopes = [];
|
|
||||||
|
|
||||||
foreach ($results as $scope)
|
|
||||||
{
|
|
||||||
$scopes[] = (new ScopeEntity($this->server))->hydrate([
|
|
||||||
'id' => $scope['id'],
|
|
||||||
'description' => $scope['description'],
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $scopes;
|
|
||||||
*/
|
|
||||||
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function create($owner_type, $owner_id, $client_id, $client_redirect_uri = null)
|
|
||||||
{
|
|
||||||
return $this->mongo->oauth_sessions->insert([
|
|
||||||
'owner_type' => $owner_type,
|
|
||||||
'owner_id' => $owner_id,
|
|
||||||
'client_id' => $client_id,
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function associateScope(SessionEntity $session, ScopeEntity $scope)
|
|
||||||
{
|
|
||||||
$sql = 'INSERT INTO oauth_access_token_scopes'
|
|
||||||
. ' (access_token_id, scope_id)'
|
|
||||||
. ' VALUES'
|
|
||||||
. ' (?, ?);';
|
|
||||||
|
|
||||||
$this->db->execute($sql, [$session->getId(), $scope->getId()]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
38
src/OAuth2/Storage.php
Normal file
38
src/OAuth2/Storage.php
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Pickles\OAuth2;
|
||||||
|
|
||||||
|
use \OAuth2\Storage\Mongo;
|
||||||
|
|
||||||
|
class Storage extends Mongo
|
||||||
|
{
|
||||||
|
private $mongo;
|
||||||
|
|
||||||
|
public function __construct($connection, $config = [])
|
||||||
|
{
|
||||||
|
parent::__construct($connection, $config);
|
||||||
|
|
||||||
|
$this->mongo = \Pickles\Mongo::getInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUser($email)
|
||||||
|
{
|
||||||
|
return $this->mongo->user->findOne(['email' => $email]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUserDetails($email)
|
||||||
|
{
|
||||||
|
if ($user = $this->getUser($email))
|
||||||
|
{
|
||||||
|
$user['user_id'] = $user['_id']->{'$id'};
|
||||||
|
}
|
||||||
|
|
||||||
|
return $user;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function checkPassword($user, $password)
|
||||||
|
{
|
||||||
|
return $user && password_verify($password, $user['password']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Pickles\OAuth2;
|
|
||||||
|
|
||||||
use \League\OAuth2\Server\Storage\Adapter;
|
|
||||||
use \Pickles\Config;
|
|
||||||
use \Pickles\Mongo;
|
|
||||||
|
|
||||||
class StorageAdapter extends Adapter
|
|
||||||
{
|
|
||||||
protected $config;
|
|
||||||
protected $mongo;
|
|
||||||
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
$this->config = Config::getInstance();
|
|
||||||
$this->mongo = Mongo::getInstance();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue