Drahak restful & oauth2 example
- chap
- Člen | 81
Ahoj,
já bych taky ocenil příkladnější příklad. :) Trochu bojuji s OAuth2. Restful api jsem rozchodil, vytvořil abstraktní třídu pro přihlášené api:
abstract class BaseapiPresenter extends ResourcePresenter {
protected $typeMap = array( 'json' => IResource::JSON, 'xml' => IResource::XML );
/** @var \Drahak\Restful\Security\Process\OAuth2Authentication */
public $authenticationProcess;
public function __construct( \Drahak\Restful\Security\Process\OAuth2Authentication $p) {
parent::__construct();
$this->authenticationProcess = $p;
}
public function checkRequirements($element)
{
parent::checkRequirements($element);
$this->authentication->setAuthProcess($this->authenticationProcess);
}
}
Pak jsem si vytvořil služby AuthorizationCodeStorage,AccessTokenStorage,
RefreshTokenStorage – zde jsem implementoval daná rozhraní (zatím bez
těla metod pro testování co se kde volá).
Pak jsem implementoval IClientStorage
class ClientStorage extends \Nette\Object implements \Drahak\OAuth2\Storage\Clients\IClientStorage {
public function getClient($clientId, $clientSecret = NULL) {
if (!$clientId) return NULL;
$data = ... // nadi podle clientId a pripadne clientSecret
if (!$data) return NULL;
return new Client($data->id, $data->secret, $data->redirect_url);
}
public function canUseGrantType($clientId, $grantType) {
return true; // nebudeme rozlisovat prava
}
}
Pak podle dokumentace jsem vytvořil api presenter pro
class AuthorizationPresenter extends OAuthPresenter
{
/**
* Authorization
* @param string $response_type
* @param string $redirect_uri
* @param string|null $scope
*/
public function actionAuthorize($response_type, $redirect_uri, $scope = NULL)
{
if (!$this->user->isLoggedIn()) {
$this->redirect('AnyUser:login', array('backlink' => $this->storeRequest()));
}
if ($response_type == 'code') {
$this->issueAuthorizationCode($response_type, $redirect_uri, $scope);
} else if ($response_type == 'token') {
$this->issueAccessToken(IGrant::IMPLICIT, $redirect_uri);
}
}
/**
* Access token provider
*/
public function actionToken()
{
try {
$this->issueAccessToken();
} catch (OAuthException $e) {
$this->oauthError($e);
}
}
}
Výsledek po spuštění je teď takový, že mi API vrací toto:
<root>
<code>0</code>
<status>error</status>
<message>Token was not found.</message>
</root>
Takže to vypadá, že se OAuth nastartuje, ale evidentně tam mám něco špatně – rozhodně nevím, kde provést to přihlášení. A např. metoda actionAuthorize, která bych čekal, že bude volána, tak se k ní nedostanu.
- Ještě jen zmíním k čemu API chci – potřebuji zpřístupnit data z aplikace pro všechny uživatel, které mám definovány a pro všechny uživatele stejné práva. V OAuth2 jsem koukal, že je připravena DB struktura s 10 tabulkami, což mi přijde poměrně dost na to, že chci jen zpřístupnit data pro externí aplikace. Nebylo by lepší řešení než OAuth2?
Předem díky,
Chap
Editoval chap (5. 5. 2015 22:13)
- jspetrak
- Člen | 15
Když se dívám do kódu Extension.php v Drahak/OAuth2, tak jednotlivé storage (accessTokenStorage, refreshTokenStorage, authorizationCodeStorage, clientStorage) neberou v potaz parametr z configu a nejde tak vyměnit implementaci za vlastní. Zvažuju fork a případně pull request, jakmile to odladím.