2009-04-21 7 views
1

Nous avons actuellement un site Web qui a des fonctionnalités de compte utilisateur, mais nous cherchons à fournir une API pour permettre aux utilisateurs de gérer leurs comptes/effectuer des actions via d'autres appareils/sites Web, en fournissant une API pour les tâches courantes.Comment faire l'authentification dans un service HTTP?

Actuellement la connexion se fait via le site HTTPS pour la sécurité, puis géré à l'aide des sessions PHP avec des mesures de sécurité appropriées pour se prémunir contre le détournement de session, etc.

Comment pourrions-nous fournir cette fonctionnalité dans une API?

Comment est-il possible de soumettre une connexion sans faire un POST? (Comme probablement GET est le seul moyen de le faire via un appel d'API). Est en cours une URL comme: https://www.example.com/login/[email protected]=bar sécurisé? Est-ce que la configuration https se produit avant que l'URL ne soit envoyée sur le réseau?

Si je peux trier cela alors je voudrais que le login retourne un jeton d'accès. La première requête doit inclure ce jeton, et la réponse doit renvoyer un nouveau jeton , à utiliser sur la deuxième requête et ainsi de suite ....

Est-ce que cela fonctionnerait?

Répondre

2

Vous pouvez utiliser basic www-authentication. Il s'agit essentiellement d'un en-tête contenant un nom d'utilisateur et un mot de passe. La bonne chose à ce sujet, c'est qu'il est sans état (vous n'avez pas besoin d'un processus de connexion séparé), et il est très bien pris en charge. C'est aussi très simple à mettre en œuvre. Tant que vous le servez sur https, la sécurité est bonne.

Est-ce qu'un URL comme: https://www.example.com/login/[email protected]=bar est sécurisé?

Il est déconseillé de placer les informations d'identification dans l'URL, car elles peuvent se retrouver dans un journal.

La configuration https se produit-elle avant que l'URL ne soit envoyée sur le réseau?

Oui, https est établi avant le protocole http. La seule chose qu'une personne malveillante serait capable de voir, ce sont les adresses IP des points de terminaison.

+0

... mais cela impliquerait que les «autres sites Web» de Vinsage dans «effectuer des actions via d'autres appareils/sites Web» auraient besoin de connaître les informations d'identification. – Arjan

+0

@Arjan: Si vous demandez si les points de terminaison auront besoin de connaître le mot de passe, alors oui. Si c'est un problème, vous pouvez utiliser un certificat pour la connexion ssl. Ensuite, vous n'avez besoin d'aucune authentification explicite, puisque https fournirait à la fois le cryptage et l'authentification. C'est un peu plus lourd à mettre en place - à la fois pour le serveur et le client. – troelskn

+0

Compte tenu de votre commentaire à ma réponse, je suppose que vous comprenez, mais juste pour être sûr: avec OAuth l'utilisateur autorise une tierce partie (autrement non fiable) à utiliser un service en son nom. Le tiers ne connaîtra pas les informations d'identification de l'utilisateur et l'utilisateur pourra choisir d'accorder une autorisation une seule fois ou de révoquer l'autorisation à tout moment. En effet, tout se résume à savoir si Visage souhaite vraiment accorder à des tiers l'accès à l'API. – Arjan

0

Avez-vous pensé à utiliser SOAP sur SSL? En théorie, vous devriez pouvoir authentifier un utilisateur via SOAP.

2

Utilisez un standard, tel que OAuth? Si vous le permettez, votre utilisateur peut conserver le jeton authentifié aussi longtemps qu'il le souhaite. Sinon, vous pouvez ne pas avoir besoin d'authentification du tout, si vous pouviez rediriger vers un login quand une requête GET arrive. Par exemple: n'importe quel site peut créer un lien vers une URL vers add a tweet vers Twitter. Lorsqu'il n'est pas connecté, Twitter redirige d'abord vers la page de connexion. Le site référent n'a même pas besoin de connaître le nom d'utilisateur Twitter.

(Et oui:. HTTPS est établie, basée sur l'adresse IP du serveur, avant que l'URL est envoyée)

+0

OAuth est pour l'autorisation - pas d'authentification. Cela pourrait s'appliquer à cette affaire, mais je ne pense pas que c'est ce que Visage demande. – troelskn

+0

Eh bien, pour obtenir les jetons, il faut d'abord s'authentifier. Et pour permettre à d'autres sites d'accéder à l'API (comme Visage le demande) sans révéler les informations d'authentification, je pense qu'OAuth est la voie à suivre. – Arjan

+0

En relisant la question, je pense que vous avez peut-être raison à ce sujet. – troelskn

0

Vous pouvez effectuer une authentification dans une API REST en exigeant qu'un en-tête soit défini par l'appelant. C'est-à-dire qu'ils définissent un en-tête "X-YourApp-API-Key" que vous lisez et utilisez pour vous authentifier. Cela vous permet d'authentifier non seulement les méthodes POST et GET, mais aussi PUT, HEAD et DELETE pour disposer de toutes les méthodes REST.

Cela est très bien si tous vos appels sont via HTTPS. Si vous souhaitez vous authentifier via HTTPS et recevoir ensuite des appels via HTTP, vous devez implémenter quelque chose qui fonctionne comme OAuth et émettre un jeton pour les demandes en clair.

+0

Je ne suis pas d'accord. OAuth ou quelque chose de similaire est simplement une exigence lorsque vous autorisez des tiers à utiliser une API pour le compte de l'utilisateur, sinon le tiers a besoin de connaître les informations d'identification de l'utilisateur complet (indépendamment de l'utilisation de HTTPS ou non). – Arjan

+0

La clé "X-YourApp-API-Key" est normalisée en tant qu '"Autorisation" (également appelée www-authentification). Utilisez-le pour assurer l'interopérabilité. – troelskn

+0

À droite, si la tierce partie utilise l'API au nom d'un autre utilisateur final, vous devez utiliser OAuth pour protéger les informations d'identification de l'utilisateur. Si la tierce partie utilise directement l'API elle-même, ce n'est peut-être pas le cas. Tout dépend de ce que votre API est pour. – Pax

Questions connexes