REST API pro mobilní aplikaci
- pista5
- Člen | 72
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 | 1197
Ahoj, odpovim asi jen castecne. V contributte mame take oauth2-server od phpleague, ktery je pro Nette 3. Zkus mrknout.
- pista5
- Člen | 72
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)
- pista5
- Člen | 72
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 | 1029
Řekl bych, že to je prostě jenom bug, tady má být
$ttl = new Statement(DateInterval::class, [$ttl]);
- Pavel Kravčík
- Člen | 1195
@pista5: Můžeš poslat PR. Určitě jim ušetříš práci, když to zároveň i otestuješ. ;)
- pista5
- Člen | 72
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 | 1197
@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 | 72
@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 | 72
@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)