Module Services API Keys Authentication

Soumis par GoZ le jeu 17/03/2016 - 13:15

Module Services API Keys Authentication

## Definition du besoin

Dans le cadre d'un projet pour Commerce Guys, le besoin était de fournir un webservice permettant à la fois d'authentifier l'application consommant le service mais également d'authentifier les utilisateurs utilisant cette application, les utilisateurs (et leur authentification) étant dissociés de l'authentification de l'application.

Les avantages d'une telle solution sont de permettre au fournisseur de webservice d'autoriser une application à accéder seulement à une partie des ressources, ajouer des quotas, ou tout autre limitation, tout en laissant la possibilité d'utiliser l'authentification utilisateur pour les utilisateurs.

### Exemples

Nous pouvons ainsi par exemple développer une application mobile (iOs), disposant d'une clé d'authentification qui lui est propre et qui permet d'accéder à différentes ressources du service. Via cette application, un ou plusieurs utilisateurs pourront se connecter avec leurs accès d'utilisateur Drupal.
On peut imaginer qu'elle permettra d'accéder aux ressources de la bibliothèque de produit, de passer commande et d'historique de commandes d'un utilisateur authentifié.

Nous pouvons également créer une seconde application, web cette fois-ci, qui aura sa propre clé d'authentification mais ne pourra pas accéder aux mêmes ressources du service. Dans cette configuration, elle ne permettra pas par exemple d'accéder aux ressources d'historique de commandes d'un utilisateur authentifié, mais qu'elle pourra toutefois accéder à la bibliothèque de produits et que l'utilisateur pourra passer commande.

### État de l'art

Aucun module Drupal n'existait avec ce niveau de granularité, la plupart proposant seulement :

* Une seule clé d'authentification.
* Une authentification liée à l'authentification utilisateur.

### Réalisation

Le module [services_auth_apikeys](https://www.drupal.org/project/services_auth_apikeys) a été conçu par Tavi Toporjinschi ([vasike](https://www.drupal.org/u/vasike)) & moi-même et majoritairement réalisé par Tavi. Il fonctionne actuellement en production, consommé à l'heure actuelle par au minimum 2 applications quotidiennement.

## Fonctionnement et configuration du module

Le module se base sur l'entité utilisateur de Drupal et ajoute un droit qui autorise un utilisateur à accéder ou non aux services.

* Installer le module [services_auth_apikeys](https://www.drupal.org/project/services_auth_apikeys).
* Ajouter un rôle via /admin/people/permissions/roles et lui donner les droits "Use API keys authentication".
* Aller sur l'interface de modification de ressources pour le service souhaité.
* Listing des services: /admin/structure/services.
* Dans l'onglet "Authentification" d'un service, 3 clés d'API sont disponibles: API key, token, extra key (optionnel). Pour chaque clé d'api, il est possible de configurer:
* Le type de paramètre: Comment cette clé d'API doit être envoyé au service (GET, POST, En-tête HTTP).
* L'identifiant: Quel identifiant vous souhaité utiliser pour cette clé.
* Option de génération: L'utilisateur sera capable de modifier ou générer cette clé.
* Activer une clé supplémentaire si besoin.
* Modifier les ressources du service selon vos besoins:
* Désactiver l'authentification pour cette ressource.
* Owner login: Après l'authentification de l'application, l'utilisateur propriétaire des clés sera lui-même authentifié.
* Configurer les accès pour ce rôle. Par défaut, les rôles ont accès à l'ensemble des ressources. Il est possible pour chaque ressource de leur interdire l'accès.
* Création d'un compte avec ses Tokens.
* Aller sur l'interface de création d'utilisateurs: /admin/people/create.
* Créer cet utilisateur en lui donnant le rôle de webservice souhaité.
* Générer les tokens de cet utilisateur. Pour cela, aller sur son profil et cliquer sur l'onglet "Services API keys", ou accéder directement à cette page /user/[UID]/services-apikeys où [UID] est le numéro de l'utilisateur. Cliquer sur "Generate new API Keys" pour le service souhaité. Il est possible de les modifier manuellement une fois ces tokens générés dans le cas où l'on souhaiterait appliquer les tokens d'un autre environnement.

*Crédits d'image www.simicart.com*