REST API pro mobilní aplikaci

pista5
Člen | 60
+
0
-

Ahoj,
potřebuji k aplikaci v Nette 3 udělat REST API pro mobilní aplikaci a trochu v tom tápu…

Pouzil jsem tento API router, ktery mi chodí v pořádku:
https://github.com/…e/api-router

Teď ale řeším ověřování uživatelů… pokud jsem to správně pochopil, musím mít na Nette nějaký OAuth 2 Server, který se o toto bude starat.

Byl zde v diskuzi doporučován https://github.com/…auth2-server, ktery je postavený na Oauth 2 Serveru od thephpleague.com
…avšak je to pro Nette 2.4

Existuje nějaké hotové řešení pro Nette 3?

Felix
Nette Core | 1186
+
0
-

Ahoj, odpovim asi jen castecne. V contributte mame take oauth2-server od phpleague, ktery je pro Nette 3. Zkus mrknout.

https://contributte.org/…-server.html

pista5
Člen | 60
+
0
-

Děkuji, vyzkoušel jsem, ale narazil jsem na toto a nevím si rady:

v common.neon mám:

extensions:
    oauth2.server: Contributte\OAuth2Server\DI\OAuth2ServerExtension

services:
	- App\Repositories\ClientRepository
	- App\Repositories\AccessTokenRepository
	- App\Repositories\ScopeRepository
	- App\Repositories\AuthCodeRepository
	- App\Repositories\RefreshTokenRepository
	- App\Repositories\UserRepository
	router: App\Router\RouterFactory::createRouter

oauth2.server:
  encryptionKey: "7DD2tOi6tZxx1dNtfVnZEBvLc2JxA7/CMGJT4tnDYm8="
  privateKey:
    path: %appDir%/Repository/private.key
    passPhrase:
    permissionCheck: false
  publicKey:
    path: %appDir%/Repository/public.key
    passPhrase:
    permissionCheck: false
  grants:
    refreshToken: true

Oauth2Presenter je prazdný

<?php
declare(strict_types=1);

namespace App\Presenters;

use App\Repositories\RefreshTokenRepository;
use League\OAuth2\Server\AuthorizationServer;
use Nette\Application\UI\Presenter;


class Oauth2Presenter extends Presenter
{
    /** @var AuthorizationServer @inject */
    public $authorizationServer;
    /** @var RefreshTokenRepository @inject */
    public $refreshTokenRepository;


    public function actionEndpoint(): void
    {

    }
}

a pokud dám https://www.web2.h/oauth2/endpoint dostanu pri injectovani AuthorizationServer tuto chybu na ř. 469

DateInterval::__construct() expects parameter 1 to be string, object given

459: return $service;
460: }
461:
462:
463: public function createServiceOauth2__server__grant__authCode(): League\OAuth2\Server\Grant\AuthCodeGrant
464: {
465: return new League\OAuth2\Server\Grant\AuthCodeGrant(
466: $this->getService(‚04‘),
467: $this->getService(‚05‘),
468: new DateInterval(\Nette\PhpGenerator\Dumper::createObject(‚DateInterval‘, [
469: ‚y‘ ⇒ 0,
470: ‚m‘ ⇒ 0,
471: ‚d‘ ⇒ 0,
472: ‚h‘ ⇒ 0,
473: ‚i‘ ⇒ 10,

Kde je prosim problem?

Editoval pista5 (9. 12. 2020 13:23)

dakur
Člen | 493
+
0
-

@pista5 Však to tam máš napsané: DateInterval::__construct() expects parameter 1 to be string, object given 🙂

pista5
Člen | 60
+
0
-

dakur napsal(a):

@pista5 Však to tam máš napsané: DateInterval::__construct() expects parameter 1 to be string, object given 🙂

Tak číst umím :))))

Jde mi o to, proč ta chyba vznika…
Jak jsem pochopil, https://contributte.org/…-server.html je nadstavba pro https://github.com/…auth2-server do Nette

Instalaci a nastaveni jsem provedl presne podle navodu: https://contributte.org/…-server.html
…ale pri injectovani AuthorizationServer dostanu tu chybu. Nechapu, proc nastala tato chyba? Doslo k nejakemu update v thephpleague/oauth2-server, na kterym jeste neni contributte/oauth2-server upraven? Prochazel jsem kod, ale nejsem schopen na nic prijit…

jiri.pudil
Nette Blogger | 1028
+
+1
-

Řekl bych, že to je prostě jenom bug, tady má být

$ttl = new Statement(DateInterval::class, [$ttl]);
pista5
Člen | 60
+
+1
-

Dekuji moc, to je ono :))

@Felix – muzes to prosim opravit

Pavel Kravčík
Člen | 1180
+
+2
-

@pista5: Můžeš poslat PR. Určitě jim ušetříš práci, když to zároveň i otestuješ. ;)

https://github.com/…xtension.php#L102

pista5
Člen | 60
+
0
-

Narazil jsem na další problem, s kterym si nevim rady… pomuze prosim nekdo?

Pouzil jsem vzor, ktery je zde: https://contributte.org/…-server.html#…
a na teto radce:

$this->sendResponse($sendResponse->getApplicationResponse());

mi to hazi chybu:
TypeError: Argument 1 passed to Nette\Application\UI\Presenter::sendResponse() must be an instance of
Nette\Application\IResponse, null given, called in D:\localhost_html\www2\app\Presenters\Oauth2Presenter.php on line 62

Prošel jsem kod a nikde jsem nenasel, ze by se nastavovalo ApplicationResponse – nikde se nespousti withApplicationResponse() z Contributte\Psr7\Nette – NetteResponseTrait.

Felix
Nette Core | 1186
+
0
-

@pista5 Ahoj, budu rad, kdyz posles v PR opravu. Diky.

pista5
Člen | 60
+
0
-

@Felix Ahoj, to byla pouze jedna chyba… po jeji odstraneni jsem narazil na dalsi a s tou uz si nevim rady…

Nebyl nejaky zasadnim zpusoben aktualizovan puvodni projekt Oauth 2 Serveru od thephpleague.com a tim je ted ta nadstavba nefunkcni?

Felix
Nette Core | 1186
+
0
-

@pista5 Ahoj, vyclenil jsem si nejaky cas a udelal par uprav. Prosim, otestuj verzi v0.2.1 (https://github.com/…auth2-server).

V presenteru by jsi mel upravit action zhruba takto:

public function actionEndpoint(): void
    {
		{ .... }
        $this->sendResponse(new Oauth2Response($reply));
    }
pista5
Člen | 60
+
0
-

@Felix Ahoj, diky moc, funguje!

pista5
Člen | 60
+
0
-

@Felix tak bych mel precijen jeste 2 veci, u kterych si nejsem jisty, zda je to OK.

Pokud zadam spravne username a heslo, vrati se mi spravne 200 a v Response Body pak:

{"token_type":"Bearer","expires_in":3600,"access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9"}

Pokud vsak zadam udaje spatne, vrati se spravne 400, ale v Response Body se vrati totez… to by asi nemelo, ne?

A druhy dotaz… v Response Headers jsou nektere zaznamy zdvojene… je to OK?

Date: Mon, 21 Dec 2020 09:46:18 GMT
Server: Apache/2.4.41 (Win64) OpenSSL/1.1.1c PHP/7.3.10
X-Powered-By: Nette Framework 3
X-Powered-By: Nette Framework 3
X-Frame-Options: SAMEORIGIN
X-Frame-Options: SAMEORIGIN
Set-Cookie: PHPSESSID=n0q38496f9sootcm6r8qdcd5ul; expires=Mon, 04-Jan-2021 09:46:18 GMT; Max-Age=1209600; path=/; HttpOnly
Set-Cookie: PHPSESSID=n0q38496f9sootcm6r8qdcd5ul; expires=Mon, 04-Jan-2021 09:46:18 GMT; Max-Age=1209600; path=/; HttpOnly
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Vary: X-Requested-With
pragma: no-cache
cache-control: no-store
Content-Length: 95
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: application/json; charset=UTF-8

pista5
Člen | 60
+
0
-

@Felix – tak jsem se na to jeste dival a nemelo by to byt takto, aby tam hlavicky nebyly zdvojene?

public function send(IRequest $httpRequest, IResponse $httpResponse): void
	{
		$httpResponse->setCode($this->psr7->getStatusCode());
		$exist_headers = $httpResponse->getHeaders();

		foreach ($this->psr7->getHeaders() as $name => $values) {
			foreach ($values as $value) {
			    if (!isset($exist_headers[$name])) {
                    $httpResponse->addHeader($name, $value);
                }
			}
		}

		$stream = $this->psr7->getBody();
		$stream->rewind();

		while (!$stream->eof()) {
			echo $stream->read(8192);
		}
	}

Editoval pista5 (14. 1. 2021 11:01)