Nous utilisons les modules 'Simple OAuth' et 'jsonapi' pour l'authentification frontale dans Angular de notre projet découplé Drupal project.
Nous avons remarqué que lorsque les informations d'identification de l'utilisateur sont correctes mais que le jeton a expiré, la réponse de l'en-tête est toujours de 200 `` ok '' avec un message qui indique que le jeton n'est plus valide.
Mais nous avons besoin d'un 400/401 ou 403, comme il est décrit dans les documentations sur le serment .
Y a-t-il une raison pour laquelle cela est mis en œuvre comme ça? Ou existe-t-il un moyen de modifier la réponse?
Y a-t-il une raison pour laquelle cela est mis en œuvre comme ça?
200 ok
est le code d'état attendu pour les ressources de collecte, même si une, plusieurs ou toutes les entités ont été exclues de la ressource de collecte pour des raisons d'accès.
De https://www.drupal.org/project/jsonapi/issues/2853066 :
Le code d'état d'une "ressource de collection" doit être entièrement distinct de tout ou partie des entités représentées sur cette ressource.
Sauf s'il existe un mécanisme de contrôle d'accès qui est explicitement une condition préalable à l'accès à toute liste d'entités d'un type donné que nous pouvons exploiter, il faut supposer que tout consommateur doit avoir accès à n'importe quelle collection
Il est complètement cohérent avec REST pour renvoyer une réponse 200 à une collection vide, même lorsque toutes ces entités ont été élidées pour des raisons d'accès.
Ou existe-t-il un moyen de modifier la réponse?
Bien sûr vous pouvez. Consultez la documentation sur la modification des itinéraires et la fourniture d'un service balisé d'accès personnalisé:
Enfin, le lien que vous avez fourni dans la question est vers oauth specs, et n'est pas pertinent pour jsonapi. Oauth ressource dans Drupal = (/oauth/token
) vous donnera correctement 4xx en cas d'erreur lors de l'obtention d'un nouveau jeton.
J'ai trouvé une méthode qui fonctionne pour moi.
<?php
namespace Drupal\modulename\Routing;
use Drupal\Core\Routing\RouteSubscriberBase;
use Symfony\Component\Routing\RouteCollection;
/**
* Listens to the dynamic route events.
* https://www.drupal.org/docs/8/api/routing-system/altering-existing-routes-and-adding-new-routes-based-on-dynamic-ones
*/
class ModuleNameRouteSubscriber extends RouteSubscriberBase {
/**
* {@inheritdoc}
*/
protected function alterRoutes(RouteCollection $collection) {
//issue is this only works for JUST /rahapi and not anything else
//if ( $route = $collection->get('jsonapi.resource_list') ) {
// $route->setRequirement('_user_is_logged_in', 'TRUE');
//}
foreach ($collection->all() as $route) {
if (strpos($route->getPath(), '/jsonapi') === 0 ) {
$route->setRequirement('_user_is_logged_in', 'TRUE');
}
}
}
}
Cela va dans modulename/src/Routing/ModuleNameRouteSubscriber.php
Ensuite, cela va dans modulename/modulename.services.yml
services:
route_subscriber:
class: Drupal\modulename\Routing\ModuleNameRouteSubscriber
arguments: []
tags:
- { name: event_subscriber }
Je l'ai donc trouvé en allant ici: https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Routing%21RouteSubscriberBase.php/class/RouteSubscriberBase/8.2.x
Je prolonge donc cela ... et je vois qu'il y a beaucoup d'autres choses qui le prolongent. Comme celui-ci pour/admin. J'ai donc fait monkey-see-monkey-do et généré le code ci-dessus. J'espère que mon exemple de code fonctionne pour vous.
Merci zaporylie de m'avoir pointé dans la direction initiale.
Avant cette implémentation, vous pouvez appeler une autre API qui débogue le jeton. Fournissez simplement un jeton dans l'en-tête et dans les résultats, nous obtiendrons les détails d'expiration du jeton.
api :- http://your_url/oauth/debug?_format=json