ZF2-API-Antwortereignis, das von bjyauthorize abgefangen wurdePhp

PHP-Programmierer chatten hier
Anonymous
 ZF2-API-Antwortereignis, das von bjyauthorize abgefangen wurde

Post by Anonymous »

Wie verhindere ich, dass bjyauthorize meinen ausgelösten API-Ereignisfehler abfängt?
bjyauthorize leitet nicht angemeldete Benutzer zum Anmeldeformular weiter, wie zur Konfiguration hinzugefügt. Da meine API jedoch für alle Rollen zugelassen ist, auch für Gastrollen, möchte ich nur, dass sie eine von ApiProblemListener
ApplicationRest\Module.php
abgefangene Json-Fehlermeldung zurückgibt

Code: Select all

class Module implements
ConfigProviderInterface,
AutoloaderProviderInterface
{

public function onBootstrap(MvcEvent $e)
{
$app = $e->getApplication();
$sm = $app->getServiceManager();
$events = $app->getEventManager();

$listener = $sm->get('ApplicationRest\ApiAuthenticationListener');
$events->getSharedManager()->attach('ApplicationRest\Controller', 'dispatch', $listener, 500);

$events->attach('render', array($this, 'onRender'), 100);
$events->attach($sm->get('ApplicationRest\ApiProblemListener'));
}

/**
* Listener for the render event
* Attaches a rendering/response strategy to the View.
*
* @param  \Zend\Mvc\MvcEvent $e
*/
public function onRender($e)
{
$result = $e->getResult();
if (!$result instanceof RestfulJsonModel) {
return;
}
//var_dump(123);exit();

$app = $e->getTarget();
$services = $app->getServiceManager();
$view = $services->get('View');
$restfulJsonStrategy = $services->get('ApplicationRest\RestfulJsonStrategy');
$events = $view->getEventManager();

// register at high priority, to "beat"  normal json strategy registered
// via view manager
$events->attach($restfulJsonStrategy, 500);
}
}
Ich habe viele Module und denke wirklich darüber nach, mein apiModule „ApplicationRest“ in ein anderes Projekt zu verschieben, möchte aber nicht jedes Mal Modell und Dienst aktualisieren, wenn ich einige Aktualisierungen am Hauptprojekt vornehme.
BEARBEITEN: Weitere HeaderAuthentication-Klasse bereitgestellt

Code: Select all

class HeaderAuthentication implements AdapterInterface
{

const AUTHORIZATION_HEADER = 'Authorization';
const CRYPTO = 'sha256';

protected $request;
protected $repository;

public function __construct(RequestInterface $request, UserRepository $repository)
{
$this->request = $request;
$this->repository = $repository;
}

/**
* Authorization: Key={key} Timestamp={timestamp} Signature={signature}
* @return Result
*/
public function authenticate()
{
$request = $this->getRequest();
if (!$request instanceof Request) {
return;
}
$headers = $request->getHeaders();

// Check Authorization header presence
if (!$headers->has(static::AUTHORIZATION_HEADER)) {
return new Result(Result::FAILURE, null, array(
'Authorization header missing'
));
}

$authorization = $headers->get(static::AUTHORIZATION_HEADER)->getFieldValue();

// Validate public key
$publicKey = $this->extractPublicKey($authorization);
$user = $this->getUserRepository()
->findOneByApiSecret($publicKey);

if (null === $user) {
$code = Result::FAILURE_IDENTITY_NOT_FOUND;
return new Result($code, null, array(
'User not found based on public key'
));
}

// Validate signature
$signature = $this->extractSignature($authorization);
/*$hmac = $this->getHmac($request, $user);
if ($signature !== $hmac) {
$code = Result::FAILURE_CREDENTIAL_INVALID;
return new Result($code, null, array(
'Signature does not match'
));
}*/

return new Result(Result::SUCCESS, $user);
}
}
ApiAuthenticationListener

Code: Select all

class ApiAuthenticationListener
{

protected $adapter;

public function __construct(HeaderAuthentication $adapter)
{
$this->adapter = $adapter;
}

public function __invoke(MvcEvent $event)
{
$result = $this->adapter->authenticate();

if (!$result->isValid()) {
$response = $event->getResponse();

// Set some response content
$response->setStatusCode(401);
return $response;
}

// All is OK
$event->setParam('user', $result->getIdentity());
}

}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post