web-dev-qa-db-fra.com

Existe-t-il un moyen de sécuriser une clé API sur une page frontale?

Mon service autorise la conversion de tous les documents HTML en PDF à l'aide d'une demande POST . Elle est principalement utilisée sur le serveur du client de mon client et la clé d'API utilisée pour la communication est conservée. privé.

Maintenant, je pense à un moyen de permettre aux visiteurs de mes clients d'appeler mon service au nom de la clé d'API de mon client, sans exposer cette clé d'API sécurisée.

Mon problème principal ici est la sécurité. Si mon client ajoute une demande XHR POST contenant la clé API, quelqu'un peut prendre cette clé API et l'utiliser à ses propres fins en abusant du compte de mon client.

Je pourrais filtrer par domaine, mais c'est facilement / usurpé afin que ce ne soit pas possible.

Je me demandais s'il y avait un moyen d'appeler un service privé et d'être identifié sans risquer de se faire voler son identité, du côté client (client)?

6
Cyril N.

Si vous fournissez cette sous-location aux utilisateurs authentifiés, il est assez simple de leur attribuer des clés uniques (quelque chose qui hache leur ID utilisateur ou leur session contre la clé API et un horodatage initial, et les vérifie/les enregistre/recherche les brutes avant d'accéder l'API). Si vous le faites sur le Web ouvert, sans aucune sorte d’authentification de l’utilisateur, la limitation du débit devient alors très délicate. Généralement, vous voudriez utiliser une combinaison de hachages de session, adresse IP, système d'exploitation et données de navigateur pour créer un profil anonyme qui obtient une clé temporaire sur l'interface frontale. Une façon assez solide de faire cela est de forcer les utilisateurs à passer par une CAPTCHA avant de servir une clé temporaire qui leur permet un nombre limité d'utilisations de la clé permanente. Tout utilisateur dont l'adresse IP/navigateur/session correspond aux attributs existants d'une clé client connue est shunté à celle-ci (et peut ignorer le CAPTCHA); toute personne qui ne correspond pas à un profil existant obtient le CAPTCHA. Cela fait de vous une cible moins attrayante pour l'usurpation d'identité. En plus de cela, vous devriez toujours limiter la totalité du contenu, avec un nombre raisonnable de hits par jour en fonction du type de trafic que vous attendez (ou que vous pouvez vous permettre), juste pour ne pas avoir de surprises. Il s'agit de la sécurité minimale que vous souhaiteriez si l'argent de votre client est en jeu chaque fois que sa clé API est utilisée. Il faudra une simple base de données pour stocker ces "profils", suivre l’utilisation, vérifier les brutes et conserver les clés client actuellement valides. Les clés client doivent toujours être expirées régulièrement - soit avec un diff de temps par rapport à leur création, soit par un processus cron régulier, ou un nombre maximal d'utilisations, etc.

Une autre chose que je fais fréquemment est la limite de taux basée sur une courbe. Si je pense que 5 utilisations par minute est raisonnable, par exemple, puis après 5 utilisations dans une minute d'une session, chaque utilisation ajoute un délai d'une fraction de seconde * le nombre d'utilisations à la dernière minute, au carré, avant les données. est servi.

La meilleure solution serait de placer tout cela derrière un système de connexion et de sécuriser que .

1
joshstrike

Vous pouvez utiliser des jetons JWT à mon avis. Sur la base du nom d'utilisateur, du mot de passe ou de toute autre information, vous pouvez générer des jetons jwt uniques pour différents utilisateurs . Tout le monde peut déchiffrer ces jetons jwt, mais pas le jeton de sécurité unique.

Si vous souhaitez renforcer la sécurité des jetons, utilisez JWE, des jetons Web chiffrés. 

Pour en savoir plus sur ces régimes, consultez https://medium.facilelogin.com/jwt-jws-and-jwe-for-not-so-dummies-b63310d201a3

1
GraphicalDot

il n’existe aucun moyen efficace d’effectuer un stockage frontal sécurisé, mais ma recommandation est la suivante: 

est une API qui utilisait la signature HMAC de demandes en combinaison avec l'authentification OAuth. La clé API est en réalité une clé de signature. leur clé ne soit pas transférée. La clé API peut toujours être trouvée sur le serveur frontal, mais elle devient inutile car vous avez toujours besoin du jeton OAuth pour envoyer une requête valide.

je sais que les utilisateurs devront se connecter, mais vous pouvez voir cela comme un avantage, car vous pouvez au moins vous identifier qui utilise l'application en obtenant des informations de oauth.

S'il vous plaît envisager de stockage sécurisé back-end!

1
Lars Hendriks

En supposant que vous utilisiez un système de type OAuth, utilisez dans ce cas le mécanisme de jeton d'accès qui permet d'accéder aux données de l'API/de l'utilisateur privé pour le compte de l'utilisateur (client) sans exposer ses informations d'identification ou sa clé d'API (clé d'authentification), De plus, le jeton d'accès peut expirer en fonction de l'heure et de l'utilisation. 

Exemple: le jeton d'accès est généré sur un point de terminaison unique qui peut être le point de terminaison Conversion html. Il expirera une fois l'action terminée.

https://auth0.com/docs/tokens/access-token

Et suivre le blog serait utile pour l'architecture de votre système d'authentification https://templth.wordpress.com/2015/01/05/implementing-authentication-with-tokens-for-restful-applications/

1
Shahul Hameed

Le hachage est une option décente et doit être fait de toute façon, mais pour une méthode totalement sécurisée qui n’ajouterait pas trop de complexité, vous pouvez simplement vous détourner de la clé d’autorisation/API en construisant votre propre API pour l’interfacer. De cette façon, vous pouvez à la fois limiter les tâches pouvant être effectuées avec la clé API et masquer complètement la clé API de l'utilisateur.

0
krflol