Swapped the oauth lib again

This commit is contained in:
Josh Sherman 2014-10-19 18:03:04 -04:00
parent 1f3650b98a
commit 4bd4625dd3
9 changed files with 48 additions and 369 deletions

View file

@ -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",

View file

@ -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()]);
}
}

View file

@ -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;
}
}

View file

@ -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()]);
}
}

View file

@ -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);

View file

@ -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'],
]);
}
}

View file

@ -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
View 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']);
}
}

View file

@ -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();
}
}