web-dev-qa-db-fra.com

Système d'authentification API simple et sécurisé

J'ai une simple API REST _ JSON permettant à d'autres sites Web/applications d'accéder à certaines bases de données de mon site Web (via une passerelle PHP). En gros, le service fonctionne comme suit: appelez exemple.com/fruit/orange, le serveur renvoie les informations JSON concernant l’orange. Voici le problème: je ne veux que les sites Web que je permets d'accéder à ce service. Avec un système de clé API simple, tout site Web peut rapidement obtenir une clé en copiant la clé à partir du code (potentiellement) côté client d'un site Web autorisé. J'ai regardé OAuth, mais cela semble un peu compliqué pour ce que je fais. Solutions?

35
Russ

Vous devriez utiliser OAuth.

Il existe en fait deux spécifications OAuth, la version à 3 pieds et la version à 2 jambes. La version à 3 pieds est celle qui attire le plus l'attention, et c'est pas celle que vous voulez utiliser.

La bonne nouvelle est que la version à 2 pattes fait exactement ce que vous voulez, elle permet à une application d'accorder l'accès à une autre via une clé secrète partagée (très similaire au modèle de service Web d'Amazon, vous utiliserez la méthode de signature HMAC-SHA1). ou via un système de clé publique/privée (utilisez la méthode de signature: RSA-SHA1). La mauvaise nouvelle est qu’elle n’est pas aussi bien supportée que la version à 3 pieds, vous devrez donc peut-être faire un peu plus de travail que ce que vous auriez autrement à faire maintenant.

Fondamentalement, OAuth à deux branches spécifie simplement un moyen de "signer" (calculer un hachage sur) plusieurs champs qui incluent la date actuelle, un nombre aléatoire appelé "nonce" et les paramètres de votre demande. Cela rend très difficile d'emprunter l'identité des requêtes adressées à votre service Web.

OAuth est lentement mais sûrement en train de devenir une norme acceptée pour ce genre de chose - vous serez mieux servi à long terme si vous l'adoptez parce que les gens peuvent alors utiliser les différentes bibliothèques disponibles pour le faire.

C'est plus élaboré que ce que vous vouliez au départ, mais la bonne nouvelle, c'est que beaucoup de gens y ont passé beaucoup de temps, vous savez donc que vous n'avez rien oublié. Un bon exemple en est que très récemment, Twitter a découvert une faille dans la sécurité d’OAuth que la communauté s’emploie actuellement à combler. Si vous aviez inventé votre propre système, vous devez vous débrouiller seul.

Bonne chance!

Chris

28
Chris Harris

OAuth n'est pas la solution ici .
OAuth signifie que vous avez des utilisateurs finaux et que vous souhaitez que les applications tierces ne gèrent pas les mots de passe des utilisateurs finaux. Quand utiliser OAuth: http://blog.apigee.com/detail/when_to_use_oauth/

Optez pour une clé simple api .
Et prenez des mesures supplémentaires si vous avez besoin d’une solution plus sûre.

Voici quelques informations supplémentaires, http://blog.apigee.com/detail/do_you_need_api_keys_api_identity_vs._authorization/

21
Daniel Magnusson

Si le code côté client de quelqu'un est compromis, il doit obtenir une nouvelle clé. Vous ne pouvez pas faire grand chose si leur code est exposé.

Vous pouvez toutefois être plus strict en exigeant que les adresses IP des serveurs autorisés soient enregistrées dans votre système pour la clé donnée. Cela ajoute une étape supplémentaire et peut être exagéré.

Je ne sais pas ce que vous entendez par "clé API simple", mais vous devriez utiliser une sorte d'authentification avec des clés privées (connues uniquement du client et du serveur), puis exécuter une sorte d'algorithme de somme de contrôle sur les données. Assurez-vous que le client est bien celui que vous croyez et que les données n'ont pas été modifiées pendant le transit. Amazon AWS est un excellent exemple de la façon de procéder.

Je pense qu'il est peut-être un peu strict de garantir que le code n'a pas été compromis du côté de vos clients. Je pense qu'il est raisonnable d'imposer à vos clients la responsabilité de la sécurité de leurs propres données. Bien entendu, cela suppose qu'un attaquant ne peut que gâcher le compte de ce client.

Vous pourriez peut-être garder un journal des requêtes IP provenant d'un compte particulier, et si une nouvelle adresse IP arrive, signaler le compte, envoyer un courrier électronique au client et lui demander d'autoriser cette adresse IP. Je ne sais pas si quelque chose comme ça pourrait marcher.

4
Kekoa

En gros, vous avez deux options, soit restreindre l’accès par IP, soit disposer d’une clé API. Les deux options ont leurs côtés positif et négatif.

Restriction par IP
Cela peut être un moyen pratique de restreindre l’accès à votre service. Vous pouvez définir exactement quels services tiers seront autorisés à accéder à votre service sans les obliger à mettre en œuvre des fonctionnalités d'authentification spéciales. Le problème avec cette méthode est toutefois que si le service tiers est écrit entièrement en JavaScript, par exemple, l'adresse IP de la demande entrante ne sera pas l'adresse IP du serveur du service tiers, mais l'adresse IP de l'utilisateur, car la demande est faite. par le navigateur de l'utilisateur et non le serveur. L'utilisation de la restriction IP rendra donc impossible l'écriture d'applications pilotées par le client et obligera toutes les demandes à passer par le serveur avec les droits d'accès appropriés. N'oubliez pas que les adresses IP peuvent également être usurpées.

Clé API
L’avantage des clés API est qu’il n’est pas nécessaire de gérer une liste d’adresses IP connues, mais bien d’en conserver une liste, mais il est plus facile d’automatiser leur maintenance. En gros, cela fonctionne avec deux clés, par exemple un identifiant d'utilisateur et un mot de passe secret. Chaque demande de méthode adressée à votre service doit fournir un hachage d’authentification composé des paramètres de la demande, de l’identifiant de l’utilisateur et d’un hachage de ces valeurs (le mot de passe secrect étant utilisé comme sel de hachage). De cette façon, vous pouvez à la fois authentifier et restreindre l'accès. Le problème avec ceci est que, une fois de plus, si le service tiers est écrit en tant que client (par exemple, JavaScript ou ActionScript), tout le monde peut analyser le code de l'utilisateur et les valeurs de sel secrètes.

En gros, si vous voulez être sûr que seuls les quelques services que vous avez définis seront autorisés à accéder à votre service, vous ne pouvez utiliser que la restriction IP et donc les forcer à acheminer toutes les demandes via leurs serveurs. Si vous utilisez une clé API, vous ne pouvez pas appliquer cela.

2
Kim L

Toute la production de la sécurité IP semble produire un énorme bug pour les utilisateurs avant de se connecter. Symbian 60s offre la capacité la plus complète de laisser un signal non tracé, fiable et sécurisé entre plusieurs utilisateurs (en utilisant Opera Handler UI 6.5, Opera Mini v8 et 10) ainsi que l'interface utilisateur codée, + une configuration de réseau complètement remplie. Pourquoi restreindre l'accès à d'autres fonctionnalités lorsque la méthode détectable permettant de créer une liaison plus rapidement est finalement obtenue. Garder des comptes mieux identifiés, surveiller correctement ce «vrai compte» - s’ils sont sur la bonne voie, le respect du règlement des factures et le fait de savoir si les utilisateurs disposent d’un solde non expiré créeront un lien plus rapide du signal Internet vers un mobile populaire/signé. industrie. Pourquoi créer des fonctionnalités de sécurité strictes avant de les amener sur le site, une visite mensuelle de leurs comptes peut effacer tous les problèmes de connectivité? Tous les utilisateurs de mobile ne devraient pas avoir la possibilité de se "connecter" s'ils ont des factures impayées. Pourquoi ne pas fournir un compte 'ALL in One' - Enregistrement/application, un système fixe programmé avec système d'exploitation (peut-être un compte de messagerie) à la place avec une 'capacité de surveillance' s'ils paient ou non (problèmes de mot de passe préoccupants - devraient être indiqués) vers un autre département). Et si «pas» éteignez leur compte exactement et leurs autres fonctionnalités de lien. Chacun d’entre eux a ses propres intérêts à savoir où s’accrocher tous les jours, si vous les verrouillez/éteignez à cause de factures impayées qui peuvent les inciter à se réabonner et les discipliner davantage pour devenir des utilisateurs plus responsables et même expirer. un compte s'il n'est pas maintenu. La surveillance mensuelle ou l'accès à un «compte réel» identifié avec une collaboration avec le fournisseur de réseau génère une confidentialité accrue au lieu de toujours demander le nom et le mot de passe des utilisateurs, leur emplacement, leurs autorisations de visualiser leurs services de données. Les IP ont déjà marqué leur première identité ou "trouver l'emplacement des utilisateurs". Il semble donc inutile de la placer dans les pré-recherches des navigateurs. Pourquoi ne pas utiliser "Obtention de données" ou "Traitement des données"?

0
Marlon