Je conçois une API REST à l'aide d'une autorisation / authentification via une clé API.
J'ai essayé de trouver le meilleur endroit pour cela et j'ai découvert que beaucoup de gens suggèrent d'utiliser un en-tête HTTP personnalisé tel que ProjectName-Api-Key
, par exemple:
ProjectName-Api-Key: abcde
mais il est également possible et idéologiquement correct d'utiliser l'en- Authorization
tête avec un schéma personnalisé, par exemple:
Authorization: ApiKey abcde
D'un autre côté, j'ai constaté qu'un schéma d'autorisation personnalisé peut être inattendu et non pris en charge par certains clients et conduit à un code personnalisé de toute façon, il est donc préférable d'utiliser un en-tête personnalisé car les clients n'ont aucune attente à ce sujet.
De quelle manière préféreriez-vous envoyer une clé API?
Authorization: Bearer <token>
tête et il n'y a jamais eu un seul problème avec cela. Les jetons sont des JWT .Bearer
schéma est utilisé exclusivement avec oAuth2. Son application séparément de oAuth semble une mauvaise utilisation. Pourquoi est-il correct d'utiliser ce schéma s'il n'y a pas d'oAuth? Au fait, j'ai eu du mal à choisir un type d'autorisation pour mon API. L'API ne sera disponible que pour un service de confiance, j'ai donc étudié le flux des informations d'identification client de oAuth2 et je n'ai trouvé aucun avantage par rapport à ApiKey dans mon cas.ApiKey
était renommée et interprétée commeAccess Token
accordée au client sans délai d'expiration. C'est une sorte d'aspect philosophique, j'ai décidé de ne pas apporter de définitions complexes si mon cas peut être décrit en termes simples et j'ai décidé de simplement l'appeler "ApiKey". Si votre protocole implémente oAuth standart, je peux accepter l'utilisationBearer
, mais ce n'est pas le cas, je suppose que ce schéma ne peut pas être appliqué.Réponses:
Si vous utilisez l'autorisation, soyez cohérent
Certains diront que ce qui suit n'est pas nécessaire ( et il n'y a pas si longtemps, je serais d'accord avec eux ) mais, de nos jours, si nous utilisons l'en-
Authorization
tête, nous devons informer le type du jeton, car les clés API ne sont pas auto-descriptives en soi 1 .Pourquoi est-ce que je pense que c'est nécessaire et pourquoi je pense que c'est important? Parce que de nos jours, la prise en charge de différents protocoles d'authentification / autorisation est devenue un incontournable. Si nous prévoyons d'utiliser l'en-
Authorization
tête pour tous ces protocoles, nous devons rendre notre service d'authentification cohérent. La manière de communiquer le type de jeton que nous envoyons et le protocole d'autorisation à appliquer doit également figurer dans l'en-tête.Auparavant, je m'en fichais, mais après avoir travaillé avec des applications clientes dont les mises à jour n'étaient pas garanties (mobiles et capteurs principalement), j'ai commencé à le faire. J'ai commencé à être plus prudent dans la façon dont j'implémente la sécurité afin de pouvoir l'étendre sans déranger les clients et sans trop de douleur côté serveur.
Préoccupations
Les problèmes que j'ai rencontrés lors de la mise en œuvre de mes propres programmes sont similaires à celui commenté.
Dites clients , dites bibliothèques, frameworks, proxy inverses .
Les avantages
Un avantage important est le cache. Les caches partagés ne mettront pas l'en-tête en cache (et c'est bien sûr bien sûr), sauf indication contraire.
Autorisation ou en-tête personnalisé?
D'après mon expérience, l'implémentation de mon propre
Authorization
schéma m'a demandé autant de travail (ou plus) que l'implémentation d'en-têtes d'autorisation personnalisés, avec la légère différence d'avoir plus de liberté de conception et plus de contrôle sur le cache lorsque j'ai utilisé des en-têtes personnalisés. La raison est plutôt stupide, la plupart du temps j'ai leCache-control
setno-cache
ouno-store
, ce qui me permet de rendre les appels au serveur plus déterministes (c'est important quand il s'agit de suivi et de test) quelle que soit la topologie du réseau.1: Je trouve cette réponse très claire concernant les clés API
la source
X-
est déconseillée à partir de 2012: stackoverflow.com/a/3561399/923720