Il existe plusieurs schémas pour authentifier les demandes d'API, et ils sont différents de l'authentification normale fournie par des plugins comme restful_authentication ou acts_as_authenticated. Plus important encore, les clients ne maintiendront pas de sessions, il n'y a donc pas de concept de connexion.
Authentification HTTP
Vous pouvez utiliser l'authentification HTTP de base. Dans ce cas, les clients de l'API utiliseront un nom d'utilisateur et un mot de passe ordinaires et les placeront dans l'URL comme suit :
http://myusername:mypass@www.someapp.com/
Je crois que restful_authentication prend en charge cette fonctionnalité dès le départ, de sorte que vous pouvez ignorer si quelqu'un utilise votre application via l'API ou via un navigateur.
L'inconvénient est que vous demandez aux utilisateurs d'indiquer leur nom d'utilisateur et leur mot de passe en clair à chaque demande. En utilisant le protocole SSL, vous pouvez sécuriser cette opération.
Je ne pense pas avoir déjà vu une API qui utilise cette méthode, cependant. Cela me semble être une bonne idée, d'autant plus qu'elle est prise en charge d'emblée par les schémas d'authentification actuels, donc je ne vois pas où est le problème.
Clé API
Une autre façon simple d'activer l'authentification des API est d'utiliser des clés d'API. Il s'agit essentiellement d'un nom d'utilisateur pour un service distant. Lorsque quelqu'un s'inscrit pour utiliser votre API, vous lui donnez une clé d'API. Celle-ci doit être transmise avec chaque requête.
L'inconvénient est que si quelqu'un obtient la clé API de quelqu'un d'autre, il peut faire des demandes en tant qu'utilisateur. Je pense qu'en faisant en sorte que toutes vos demandes d'API utilisent le protocole HTTPS (SSL), vous pouvez compenser quelque peu ce risque.
Un autre inconvénient est que les utilisateurs utilisent les mêmes informations d'authentification (la clé API) partout où ils vont. S'ils veulent révoquer l'accès à un client API, leur seule option est de changer leur clé API, ce qui désactivera également tous les autres clients. Ce problème peut être atténué en permettant aux utilisateurs de générer plusieurs clés d'API.
Signature de la clé API + clé secrète
Déprécié (en quelque sorte) - voir OAuth ci-dessous
La signature de la demande avec une clé secrète est nettement plus complexe. C'est ce que font les services Web d'Amazon (S3, EC2, etc.). Essentiellement, vous donnez à l'utilisateur deux clés : sa clé API (c'est-à-dire son nom d'utilisateur) et sa clé secrète (c'est-à-dire son mot de passe). La clé API est transmise avec chaque requête, mais pas la clé secrète. Elle est plutôt utilisée pour signer chaque demande, généralement en ajoutant un autre paramètre.
IIRC, Amazon accomplit ceci en prenant tous les paramètres de la requête, et en les classant par nom de paramètre. Ensuite, cette chaîne est hachée, en utilisant la clé secrète de l'utilisateur comme clé de hachage. Cette nouvelle valeur est ajoutée comme nouveau paramètre à la demande avant d'être envoyée. Du côté d'Amazon, ils font la même chose. Ils prennent tous les paramètres (sauf la signature), les ordonnent et les hachent en utilisant la clé secrète. Si cela correspond à la signature, ils savent que la demande est légitime.
L'inconvénient ici est la complexité. Le bon fonctionnement de ce schéma est un casse-tête, tant pour le développeur de l'API que pour les clients. Attendez-vous à de nombreux appels à l'assistance et à des courriers électroniques de développeurs clients en colère qui ne parviennent pas à faire fonctionner le système.
OAuth
Pour combattre certains des problèmes de complexité liés à la signature clé + secret, une norme a vu le jour, appelée OAuth . À la base, OAuth est une variante de la signature clé + secret, mais une grande partie est normalisée et a été incluse dans le système de gestion de l'identité. des bibliothèques pour de nombreux langages .
En général, il est beaucoup plus facile pour le producteur et le consommateur d'API d'utiliser OAuth plutôt que de créer son propre système de clé/signature.
OAuth segmente également l'accès de manière inhérente, en fournissant des informations d'identification d'accès différentes pour chaque consommateur d'API. Cela permet aux utilisateurs de révoquer l'accès de manière sélective sans affecter leurs autres applications consommatrices.
Spécifiquement pour Ruby, il existe un Gemme OAuth qui offre une prise en charge immédiate des producteurs et des consommateurs d'OAuth. J'ai utilisé cette gemme pour construire une API et aussi pour consommer des API OAuth et j'ai été très impressionné. Si vous pensez que votre application a besoin d'OAuth (par opposition au schéma plus simple des clés d'API), alors je peux facilement recommander l'utilisation de la gemme OAuth.