Je crée une API REST, en suivant de près les suggestions d'apigee, en utilisant des noms et non des verbes, une version de l'API intégrée à l'url, deux chemins d'API par collection, l'utilisation de GET POST PUT DELETE, etc.
Je travaille sur le système de connexion, mais je ne suis pas sûr de la méthode REST appropriée pour connecter les utilisateurs. Je ne travaille pas sur la sécurité à ce stade, juste le schéma de connexion ou le flux. (Plus tard, nous ajouterons oAuth en 2 étapes, avec un HMAC, etc.)
Options possibles
- Un POST à quelque chose comme
https://api...com/v1/login.json
- Un PUT à quelque chose comme
https://api...com/v1/users.json
- Quelque chose que je n'ai pas pensé de ...
Quel est le style REST approprié pour la connexion des utilisateurs?
api
rest
design-patterns
Scott Roepnack
la source
la source
Accept
en-tête HTTP.Accept
tête, vous en auriez également unVary: Accept
, donc la mise en cache ne serait pas affectée. Conneg en extension a déjà été discuté ; Je suis cependant d'accord avec la réponse de Shonzilla.Réponses:
Principled Design of the Modern Web Architecture par Roy T. Fielding et Richard N. Taylor , c'est-à-dire que la séquence d'œuvres de toute la terminologie REST provient, contient la définition de l'interaction client-serveur:
Cette restriction remplit quatre fonctions, la 1ère et la 3ème sont importantes dans ce cas particulier:
Et maintenant, revenons à votre cas de sécurité. Chaque demande doit contenir toutes les informations requises et l'autorisation / l'authentification ne fait pas exception. Comment y parvenir? Envoyez littéralement toutes les informations requises par fil à chaque demande.
Le code d'authentification de message basé sur le hachage ou HMAC est l'un des exemples de cette méthode . En pratique, cela signifie ajouter un code de hachage du message actuel à chaque requête. Code de hachage calculé par la fonction de hachage cryptographique en combinaison avec une clé cryptographique secrète . La fonction de hachage cryptographique est soit prédéfinie, soit intégrée à la conception REST de code à la demande (par exemple JavaScript). La clé cryptographique secrète doit être fournie par le serveur au client en tant que ressource, et le client l'utilise pour calculer le code de hachage pour chaque demande.
Il existe de nombreux exemples d' implémentations HMAC , mais j'aimerais que vous prêtiez attention aux trois suivants:
Comment ça marche en pratique
Si le client connaît la clé secrète, il est prêt à fonctionner avec des ressources. Sinon, il sera temporairement redirigé (code de statut 307 Redirection temporaire) pour autoriser et obtenir la clé secrète, puis redirigé vers la ressource d'origine. Dans ce cas, il n'est pas nécessaire de savoir à l'avance (c'est-à-dire en dur quelque part) quelle est l'URL pour autoriser le client , et il est possible d'ajuster ce schéma avec le temps.
J'espère que cela vous aidera à trouver la bonne solution!
la source
TL; DR Login pour chaque demande n'est pas un composant requis pour implémenter la sécurité API, l'authentification l'est.
Il est difficile de répondre à votre question sur la connexion sans parler de la sécurité en général. Avec certains schémas d'authentification, il n'y a pas de connexion traditionnelle.
REST ne dicte aucune règle de sécurité, mais l'implémentation la plus courante dans la pratique est OAuth avec authentification à 3 voies (comme vous l'avez mentionné dans votre question). Il n'y a pas de connexion en soi, du moins pas avec chaque demande d'API. Avec l'authentification à trois voies, vous n'utilisez que des jetons.
Ce schéma donne à l'utilisateur la possibilité de révoquer l'accès à tout moment. Pratiquement toutes les API RESTful accessibles au public que j'ai vues utilisent OAuth pour mettre en œuvre cela.
Je ne pense tout simplement pas que vous devriez définir votre problème (et votre question) en termes de connexion, mais plutôt penser à sécuriser l'API en général.
Pour plus d'informations sur l'authentification des API REST en général, vous pouvez consulter les ressources suivantes:
la source
Une grande partie de la philosophie REST est d'exploiter autant de fonctionnalités standard du protocole HTTP que possible lors de la conception de votre API. En appliquant cette philosophie à l'authentification, le client et le serveur utiliseraient les fonctionnalités d'authentification HTTP standard dans l'API.
Les écrans de connexion sont parfaits pour les cas d'utilisation des utilisateurs humains: visitez un écran de connexion, fournissez un utilisateur / mot de passe, définissez un cookie, le client fournit ce cookie dans toutes les demandes futures. On ne peut pas s'attendre à ce que les humains utilisant des navigateurs Web fournissent un identifiant et un mot de passe avec chaque requête HTTP individuelle.
Mais pour une API REST, un écran de connexion et des cookies de session ne sont pas strictement nécessaires, car chaque demande peut inclure des informations d'identification sans impacter un utilisateur humain; et si le client ne coopère à aucun moment, une
401
réponse "non autorisée" peut être donnée. La RFC 2617 décrit la prise en charge de l'authentification dans HTTP.TLS (HTTPS) serait également une option, et permettrait l'authentification du client auprès du serveur (et vice versa) dans chaque demande en vérifiant la clé publique de l'autre partie. De plus, cela sécurise le canal pour un bonus. Bien entendu, un échange de paires de clés avant la communication est nécessaire pour ce faire. (Notez qu'il s'agit spécifiquement d'identifier / authentifier l'utilisateur avec TLS. Sécuriser le canal à l'aide de TLS / Diffie-Hellman est toujours une bonne idée, même si vous n'identifiez pas l'utilisateur par sa clé publique.)
Un exemple: supposons qu'un jeton OAuth soit vos informations de connexion complètes. Une fois que le client a le jeton OAuth, il peut être fourni en tant qu'identifiant d'utilisateur dans l'authentification HTTP standard avec chaque demande. Le serveur pourrait vérifier le jeton lors de la première utilisation et mettre en cache le résultat de la vérification avec une durée de vie renouvelée à chaque demande. Toute demande nécessitant une authentification est renvoyée
401
si elle n'est pas fournie.la source