web-dev-qa-db-fra.com

API publique avec jeton d'autorisation - est-il possible de protéger le jeton de démonstration?

J'ai une API REST pour exécuter certains calculs et renvoyer le résultat, avec un système de jetons très simple où seuls les utilisateurs autorisés peuvent utiliser l'API.

L'utilisateur ajoute son jeton à la requête comme ceci:

{
    authorization: 'my token',
    moreData: 51351,
    etc: 'etc'
}

Étant donné que les utilisateurs de cette API ne sont généralement pas des programmeurs, j'ai créé une page Web très simple montrant l'API, avec une démo en direct qui peut être exécutée directement à partir de la page Web, montrant comment cela fonctionne et ce qui est retourné.

Cette démonstration a un faux jeton d'autorisation, qui est affiché dans l'exemple de requête. J'ai créé une fonction JavaScript simple, cachée et partiellement obscurcie qui intercepte ce faux jeton et le remplace par un vrai jeton avant d'envoyer la demande, ce qui trompera probablement la plupart des utilisateurs. Mais un utilisateur qui regarde réellement la demande de l'outil de débogage dans le navigateur verra facilement le jeton réel qui est envoyé et peut utiliser ce jeton pour envoyer sa propre demande.

Bien sûr, je pourrais limiter le jeton de démonstration, mais cela signifierait que les utilisateurs qui expérimentent la démonstration en direct pourraient subir des blocages temporaires, ce que j'aimerais éviter.

Existe-t-il un moyen de protéger le jeton d'autorisation de démonstration d'une API qui doit être facile à utiliser et nécessite une démonstration en direct?

12
Erlend D.

Comme Steffen l'a dit, vous ne pouvez pas protéger le jeton contre les utilisateurs.

Je voudrais juste ajouter une suggestion pour un scénario plus général d'avoir une Api "démo". Il semble que votre API ne dispose pas de données stockées et ne fait que des calculs en entrée, ce qui peut ne pas vous préoccuper, mais plutôt que le jeton de démonstration pointe vers votre véritable API, vous pouvez le pointer vers une démo/sandbox version avec des données significatives mais pas réelles qui pourraient:

  1. ne contient que le jeton de démonstration - aucun autre utilisateur
  2. être réinitialisé automatiquement sur une base quotidienne
  3. contiennent une petite quantité de données plutôt que votre ensemble complet (si vous avez des données)
  4. potentiellement ne pas renvoyer des résultats valides pour tous les calculs afin d'exiger que les gens obtiennent un compte réel de vous plutôt que d'utiliser simplement le jeton de démonstration

Cela me semblerait plus sûr, car votre système en direct ne serait jamais touché par quiconque avec le jeton de démonstration, et dans les scénarios où vous pourriez avoir des fonctionnalités que vous vendez, etc., cela permet aux développeurs d'intégrer et de confirmer qu'ils se sont correctement intégrés, mais ce n'est pas le cas. donnez l'ensemble complet de fonctionnalités/données au jeton de démonstration.

27
GreatSeaSpider

Il n'est pas possible de protéger le jeton car, comme vous l'avez remarqué vous-même, l'utilisateur peut simplement regarder quel type de demande a été envoyé. Puisque le site de démonstration est sous votre contrôle, vous pouvez toutefois changer le jeton de démonstration quand vous le souhaitez. Tant que vous n'acceptez que des jetons valides et que vous changez le jeton assez souvent, vous limiterez l'utilisation abusive du jeton. Et puisque la page comprenant le jeton a été générée par le serveur, vous pouvez également générer un jeton spécifique à l'adresse IP source des utilisateurs et peut-être un cookie qui limiterait davantage toute utilisation abusive du jeton.

12
Steffen Ullrich