web-dev-qa-db-fra.com

Conception de l'API: authentification HTTP de base vs jeton d'API

Je crée actuellement un système d'authentification devant une API Web publique pour une application Web. Étant donné que chaque compte utilisateur possède une clé API et que chaque demande doit être authentifiée, j'ai deux alternatives:

  1. En utilisant une authentification HTTP de base, comme le fait GitHub .

    Les demandes doivent être envoyées à l'URL

    http://api.example.com/resource/id
    with basic authentication
    username: token
    password: the api key
    
  2. Passer le jeton d'API en tant que paramètre de chaîne de requête.

    Les demandes doivent être envoyées à l'URL

    http://api.example.com/resource/id?token=api_key
    

Il y a aussi une troisième option qui passe le jeton dans l'URI, mais honnêtement, je n'aime pas cette solution.

Quelle solution adopteriez-vous et pourquoi?

51
Simone Carletti

Je pense que HTTP Basic Auth devrait être OK mais juste pour des besoins vraiment simples.

La solution complète (et finale) à mon humble avis consiste à implémenter un fournisseur OAuth. Ce n'est pas complexe, c'est un protocole simple et vous donne beaucoup de flexibilité. De plus, il semble que ce soit la tendance actuelle car de nombreux grands acteurs l'implémentent et il est pris en charge par de nombreuses bibliothèques.

12
Diego Giorgini

Le meilleur pari pourrait être d'utiliser une clé API dans l'en-tête (par exemple, `` Autorisation: jeton MY_API_KEY '') plutôt que comme paramètre d'URL:

Avantages par rapport à l'authentification HTTP de base:

  • Plus pratique, car vous pouvez facilement expirer ou régénérer des jetons sans affecter le mot de passe du compte de l'utilisateur.
  • En cas de compromission, vulnérabilité limitée à l'API, pas au compte principal de l'utilisateur
  • Vous pouvez avoir plusieurs clés par compte (par exemple, les utilisateurs peuvent avoir des clés "test" et "production" côte à côte.)

Avantages par rapport à la clé API dans l'URL:

  • Fournit une mesure supplémentaire de sécurité en empêchant les utilisateurs de partager des URL par inadvertance avec leurs informations d'identification intégrées. (De plus, l'URL peut se retrouver dans des choses comme les journaux du serveur)
34
Yarin

Plusieurs fois, j'ai dû réfléchir à la façon d'authentifier les utilisateurs/demandes sur les API et après avoir comparé plus de solutions, j'ai fini par utiliser la solution d'Amazon où je n'ai pas besoin ou je ne peux pas utiliser OAuth. Cette solution est basée sur des signatures qui empêchent les problèmes de "l'homme au milieu" car l'authentification de base et le passage d'un simple jeton envoient des données en texte brut. Oui, vous pouvez ajouter ssl mais cela ajoutera de la complexité au système ...

17
dlondero

Je préférerais utiliser la solution de jeton. Si vous n'avez pas d'utilisateurs réels avec leur propre nom d'utilisateur et mot de passe, il semble que vous n'utilisez pas la construction Basic Auth comme prévu. Pas que ce soit nécessairement faux, mais pas aussi propre, OMI. Il supprime également la nécessité d'utiliser des en-têtes personnalisés et je pense que cela rend la mise en œuvre des deux côtés plus facile et plus propre. La prochaine question que je poserais est de savoir si vous devez utiliser l'authentification à deux facteurs ou si vous devez gérer des sessions.

0
Christopher Martin