Drahak restful & oauth2 example

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
yamboo
Člen | 10
+
-2
-

Zdravim,
snazim se rozchodit danou kombinaci pro vytvoreni jak rest serveru, tak klienta. Nema zde prosim nekdo hotove reseni pro nette, ktere by mohl poskytnout ve zdrojich? Usetrilo by mi to nejenom cas, ale hlavne i nervy, dekuji.

Drahak/restful
Drahak/oauth2
Nette 2.2.8

chap
Člen | 81
+
0
-

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
+
0
-

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.