118 votes

Dogfooding nos propres limitée dans le taux de l'API

Vue d'ensemble:

Mon entreprise a mis au point un taux limité de l'API. Notre but est de deux ordres:

  • A: Créer une forte développeur de l'écosystème autour de notre produit.
  • B: Démontrer la puissance de notre API en utilisant le moteur de notre propre application.

Précisions: Pourquoi limiter la vitesse?

Nous taux limite de notre API, parce que nous le vendre comme un complément à notre produit. L'accès anonyme à notre api a un seuil très bas pour les appels API par heure, tandis que nos clients sont autorisés à plus de 1000 appels par heure ou plus.

Le Problème:

Nos limitée dans le taux de l'API est idéal pour le développeur de l'éco-système, mais pour que nous dogfood il nous ne pouvons pas nous permettre d'être limitée à la même limitation de vitesse. Le front-end de notre API javascript, de faire directement des appels AJAX à l'API.

La question est donc:

Comment protégez-vous une api de sorte que la limitation de vitesse peut être enlevé lorsque, dans le processus de la suppression de ce de limitation de vitesse ne peut pas être facilement usurpée?

Exploré des Solutions (et pourquoi ils n'ont pas de travail)

  1. Vérifier le référent à l'encontre de l'en-tête d'hôte. -- Viciée parce que le référent est facilement truquées.

  2. Utiliser un HMAC pour créer une signature en fonction de la demande et un secret partagé, puis vérifier la demande sur le serveur. -- Viciée parce que le secret et l'algorithme peut facilement être déterminée par la recherche dans le front-end Javascript.

  3. Proxy la demande et signer la demande dans le proxy -- Encore imparfait, comme le proxy lui-même expose l'API.

La Question:

Je suis à la recherche pour les esprits brillants sur un débordement de pile de présenter des solutions de rechange. Comment voulez-vous résoudre ce problème?

94voto

Kristján Points 10183

Depuis votre propre client JavaScript pour accéder à l'API directement, n'importe qui va être en mesure de regarder ce qu'il fait et de le mimer, y compris l'utilisation de la même clé API. Vous pouvez essayer de le rendre plus difficile, comme par obscurcir votre code ou la mise à divers obstacles dans le chemin, mais vous et la personne que vous essayez de retenir ont fondamentalement le même accès. Au lieu d'essayer de créer une différence dans les privilèges, vous aurez besoin de construire un système où c'est totalement OK que le titre officieux de client utilise tous les accès à sa portée, mais le système est organisé de telle façon que l'utilisation officielle à travers tous les clients est plus grande.

Cela se fait souvent avec des jetons d'accès de l'utilisateur, par opposition à un jeton pour l'ensemble de l'application. Chaque jeton est limite devrait être beaucoup pour une utilisation typique de votre API, mais restrictifs pour quelqu'un qui essaie d'en abuser. Par exemple, 100 appels par minute peut-être plus que suffisant pour soutenir typique de la navigation, mais si je veux gratter vous, je ne peux pas le faire efficacement sur ce budget.

Il y aura toujours une course aux armements - je peux l'obtenir autour de les limiter par la création d'un grand nombre de bot comptes d'utilisateur. Que, bien que, est une jolie résolu le problème si vous venez d'ajouter un captcha à votre inscription flux, à un tout petit peu de frais pour le réel de l'homme. Quand vous entrez dans ces scénarios, tout est juste un compromis entre la facilité et la restriction. Vous ne serez jamais trouver quelque chose de totalement à l'épreuve des balles, donc se concentrer sur le fait de l'assez bonne et attendre jusqu'à ce que quelqu'un exploite que vous pouvez apprendre où les trous ont été.

33voto

abligh Points 15586

Si cela pose un problème pour vous, il fera de votre putatif écosystème de développeurs d'un problème (par exemple, lorsqu'ils essaient de développer une alternative de l'INTERFACE utilisateur). Si vous êtes vraiment manger votre propre nourriture pour chien, faire de l'API (et la limitation de débit) de travail pour votre application. Voici quelques suggestions:

  • Ne limite pas le taux par adresse IP. Plutôt, limitation de débit par quelque chose associé à l'utilisateur, par exemple, leur nom d'utilisateur. Appliquer la limite de taux à l'étape d'authentification.

  • La conception de votre API afin que les utilisateurs n'ont pas besoin de l'appeler en permanence (par exemple, accorder une liste d'appel qui renvoie à de nombreux résultats, plutôt que d'un appel répété que renvoie un élément à chaque fois)

  • La conception de votre web app avec les mêmes contraintes que vous attendez de votre développeur de l'écosystème à avoir, c'est à dire que vous pouvez le concevoir dans un délai raisonnable des taux de limitation.

  • Assurer votre back-end est évolutif (de préférence à l'horizontale), de sorte que vous n'avez pas besoin d'imposer la limitation à des niveaux si bas qu'il provoque effectivement un problème à une INTERFACE utilisateur.

  • Assurer votre limitation a la capacité de faire face à des rafales, ainsi que de limiter à long terme de l'abus.

  • Assurer votre limitation effectue sensible des actions adaptées à la violence, vous cherchez à supprimer. Par exemple, considérons les files d'attente ou de retarder doux agresseurs plutôt que de refuser la connexion. La plupart des serveurs web frontaux ne s'ouvrent qu'en quatre connexions simultanées à la fois. Si vous tardez à une tentative d'ouvrir un cinquième, vous n'aurez qu'à frapper le cas où ils sont à l'aide d'une CLI en même temps que le client web (ot deux clients web). Si vous tardez à la n-ième appel d'API, sans un écart plutôt que de ne pas, l'utilisateur final verra les choses ralentir plutôt que de rompre. Si vous combinez cela avec seulement queuing N appels de l'API à la fois, vous ne touche que les gens qui sont parallelising un grand nombre d'appels de l'API, qui n'est probablement pas le comportement que vous voulez - par exemple, 100 simultanée des appels d'API puis un écart d'une heure est généralement bien pire que 100 séquentielle des appels d'API de plus d'une heure.

Ne présente pas de réponse à votre question? Eh bien, si vous avez vraiment besoin de faire ce que vous demandez, de limiter la vitesse à l'étape d'authentification et d'appliquer un taux différent limite basée sur le groupe de votre utilisateur s'inscrit dans. Si vous utilisez un jeu d'informations d'identification (utilisé par vos développeurs et l'équipe d'assurance qualité), vous obtenez un taux plus élevé de limite. Mais vous pouvez immédiatement voir pourquoi cela va inévitablement vous conduire à votre écosystème de voir les questions que votre développement et d'assurance qualité de l'équipe de ne pas voir.

11voto

jkdev Points 930

Acheter votre produit. Devenir un client a payé vous-même.

"L'accès anonyme à notre api a un seuil très bas pour les appels API par heure, tandis que nos clients sont autorisés à plus de 1000 appels par heure ou plus."

Cela permet aussi de tester le système à partir d'un point de vue client.

9voto

Michael Aaron Safyan Points 45071

Malheureusement, il n'y a pas de solution parfaite pour cela. L'approche générale est généralement de fournir un spoofable moyen pour les clients de s'identifier (par exemple un identifiant de version et la clé de l'API, par exemple), pour les clients d'enregistrer des informations sur eux-mêmes qui peuvent être utilisés pour limiter l'accès (par exemple, le client d'un serveur dans une plage d'adresses IP, de sorte que seule permet aux appelants de la plage; par exemple, le client est en JavaScript mais livrés qu'à une catégorie spécifique de navigateur, afin de ne permettre l'accès à des requêtes HTTP qui précise un certain nombre de chaînes d'agent utilisateur, etc.), et puis à utiliser l'apprentissage de la machine/de reconnaissance de modèle pour détecter anormale de l'utilisation qui est probablement un faux client, puis de rejeter le trafic de ces usurpation de clients (ou de confirmer avec les clients que ces usages sont en effet ne vient pas de la légitime client, le remplacement de leur spoofable informations d'identification, puis interdire plus de trafic à l'aide de l'ancienne falsifié des informations d'identification).

Vous pouvez la rendre un peu plus difficile d'usurper l'identité à l'aide de plusieurs couches de clé. Par exemple, vous donnez une plus longue durée d'informations d'identification qui vit sur un serveur (et qui ne peut être utilisé dans un ensemble limité de plages d'adresses IP) pour faire un appel d'API qui enregistre des informations sur le client (par exemple, l'agent de l'utilisateur) et renvoie une courte durée de vie côté client clé qui est diffusé en JavaScript pour une utilisation sur le client pour l'API côté client le demande. Cela, aussi, est imparfaite (un usurpateur pourrait émettre le même serveur d'appel pour obtenir les informations d'identification), mais il sera plus difficile si le retour de l'API clé est inclus dans obfuscation (et de changer fréquemment de JavaScript ou HTML (ce qui rendrait difficile fiable exract de la réponse). Qui fournit également un moyen plus facile de détecter l'usurpation; le côté client de la clé est maintenant lié à un client en particulier (par exemple, spécifique de l'agent utilisateur, peut-être même un cookie jar) qui permet de les réutiliser dans un autre client facile à détecter et à l'expiration d'un délai limite également la durée pendant laquelle l'usurpation de la clé peut être réutilisé.

8voto

Anton Strogonoff Points 6792

En supposant que l'application en question doit être ouvert au public, vous n'avez pas beaucoup de choix:

Choisir une autre façon de démontrer la puissance de votre API. Par exemple, écrire une telle application et de partager sa source, mais ne fait pas exécuter ce code. Assurez-vous qu'il est bien documenté bien que, de sorte que n'importe qui peut le déployer et le voir fonctionner (sous réserve de la limitation).

L'application que vous exécutez aurait besoin d'être refait afin d'éviter API côté client des demandes et être plus serveur-rendu. Vous pouvez toujours dogfood votre API, mais pas de façon évidente-de sécuriser les demandes à gaz-libre de l'API côté serveur.

Ajuster le taux de prescription afin de permettre à votre application de travailler et d'investir dans l'optimisation de la performance pour supporter la charge.

Et ouais, ont l'API de base sans étranglement, en premier lieu, et de le garder à l'intérieur d'un réseau privé. L'accélérateur dans une autre accessible au public couche.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X