Question

Je construis application web basée Pylônes avec API RESTful, qui manque actuellement aucune authentification. Je vais donc mettre en œuvre et que pour éviter tous les problèmes et la prudence avec le stockage des mots de passe de l'utilisateur, je voudrais utiliser pour l'authentification OpenID. Quelle serait la meilleure façon de faire cela? Sont ces deux choses compatibles? Y at-il des API REST existantes qui utilisent OpenID que je peux prendre inspiration?

Était-ce utile?

La solution

Je suis maintenant passé un certain temps à la recherche des options et je voudrais résumer les conclusions. Tout d'abord, un peu plus de contexte - je développe et contrôler à la fois le service et la consommation de l'API. Consommateurs est l'application en Flash qui est servi à partir de la même hôte l'API est maintenant et est censé être utilisé dans le navigateur. Aucun client tiers encore en vue.

La question peut être divisée en deux parties,

  • comment dois-je faire l'authentification OpenID via l'API
  • Comment préservez-je l'état « authentifié » dans les requêtes suivantes

Pour la première partie, l'authentification OpenID inclut presque toujours les étapes interactives. Au cours du processus d'authentification, il y aura très probablement une étape où l'utilisateur est dans la page Web de votre fournisseur OpenID, connectez-vous et en appuyant sur une touche « Je suis d'accord ». Ainsi, l'API ne peut pas et ne doit pas gérer cette transparence (pas de « dites-moi votre fournisseur OpenID et mot de passe et je vais faire le reste »). Le meilleur qu'il peut faire est de passer en avant et en arrière des liens HTTP que le client doit ouvrir et suivez les instructions.

Le maintien de l'état "authentifié"

API REST doit être apatride, chaque demande doit inclure toutes les informations nécessaires pour gérer, non? Il ne fait aucun sens pour authentifier contre fournisseur OpenID pour chaque demande, de sorte que certains genre de séance neccessaire. Certaines des options de communication clé de session (ou « jeton d'accès » ou nom d'utilisateur / mot de passe) sont:

  • HTTPS + authentification de base ( "Authorization: Basic ..." En-tête dans chaque demande)
  • Amazon style ( "autorisation: AWS ..." en-tête dans chaque demande)
  • OAuth: acquérir jeton d'accès, comprennent cela et un tas d'autres paramètres dans chaque demande
  • Cookie qui stocke la clé de session ( "Cookie: ..." En-tête dans chaque demande)
  • biscuit Signé qui stocke des informations de session dans le cookie lui-même

Il y a juste un consommateur API en ce moment, j'ai donc choisi d'aller plus simple qui pourrait éventuellement travailler - les cookies. Ils sont super-faciles à utiliser dans Pylônes, avec l'aide de Beaker . Ils ont également « fonctionnent » dans l'application flash - car il fonctionne à l'intérieur navigateur, le navigateur comprendront les cookies pertinents dans les demandes que l'application Flash ne fait - l'application n'a pas besoin d'être changé du tout par rapport à cela. Voici une question StackOverflow qui préconise également l'utilisation des cookies: RESTful pour les applications web

Beaker a aussi belle caractéristique de cookie- seulement sessions où toutes les données de session est contenu dans le cookie lui-même. Je suppose que cela est à peu près aussi apatride qu'il obtient. Il est pas magasin de la session sur le serveur. Les cookies sont signés et éventuellement cryptées pour éviter la falsification avec eux dans le côté client. L'inconvénient est ce cookie devient un peu plus grand, car il a maintenant besoin de stocker plus que la clé de session. En supprimant certaines choses que je ne l'ai pas vraiment besoin de la session (les restes de l'authentification OpenID) Je suis la taille des cookies jusqu'à environ 200 octets.

Autres conseils

OAuth est un meilleur ajustement pour l'utilisation de l'API. Voici un exemple de OAuth utilisé en Python: oauth-python-twitter . Leah Culver python-oauth bibliothèque est la mise en œuvre canonique de OAuth en Python, mais python-oauth2 est un concurrent récent qui devient un buzz. Quant à l'inspiration, django-piston a un support pour l'utilisation de OAuth pour faire auth lorsque la création d'API RESTful pour Django, bien que la documentation est pas aussi bien que je voudrais que ce sujet particulier.

Si vous construisez API, vous pouvez vérifier le protocole OAuth. Il est complémentaire OpenID.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top