La réponse à votre question peut être au niveau du code, du protocole ou de l'architecture. Je vais essayer de résumer ici la plupart des problèmes au niveau du protocole, car cela est généralement critique dans l'analyse des avantages et des inconvénients. Gardez à l'esprit que OAuth2 est bien plus que les informations d'identification du mot de passe du propriétaire de la ressource qui, selon la spécification, existent pour des "raisons d'héritage ou de migration", sont considérées comme "à risque plus élevé que les autres types de subvention" et la spécification indique explicitement que les clients et les serveurs d'autorisation "DEVRAIT minimiser l'utilisation de ce type de subvention et utiliser d'autres types de subvention dans la mesure du possible".
Il existe encore de nombreux avantages à utiliser ROPC par rapport à l'authentification de base, mais avant d'entrer dans le détail, comprenons la différence de protocole de base entre OAuth2 et l'authentification de base. S'il vous plaît, restez avec moi pendant que j'explique cela et je reviendrai au ROPC plus tard.
Flux d'authentification des utilisateurs
Il existe quatre rôles définis dans la spécification OAuth2. Avec des exemples, ce sont:
- Propriétaire de la ressource: l'utilisateur qui a accès à une ressource, par exemple dans votre cas, différents utilisateurs peuvent avoir un niveau d'accès différent à l'API REST;
- Le client: généralement l'application que l'utilisateur utilise et a besoin d'accéder à la ressource pour fournir des services à l'utilisateur;
- Serveur de ressources: l'API REST dans votre cas; et
- Serveur d'autorisation: le serveur auquel les informations d'identification de l'utilisateur sont présentées et qui authentifiera l'utilisateur.
Lorsqu'une application cliente s'exécute, elle se voit accorder l'accès aux ressources en fonction de l'utilisateur. Si un utilisateur dispose de privilèges d'administrateur, les ressources et opérations disponibles pour l'utilisateur dans l'API REST peuvent être bien plus qu'un utilisateur sans privilèges d'administrateur.
OAuth2 offre également la possibilité d'utiliser un seul serveur d'autorisation avec plusieurs clients et pour plusieurs ressources. Par exemple, un serveur de ressources peut accepter l'authentification de l'utilisateur avec Facebook (qui peut agir comme serveur d'autorisation dans un tel cas). Ainsi, lorsque l'utilisateur exécute une application (c'est-à-dire le client), il envoie l'utilisateur à Facebook. L'utilisateur saisit ses informations d'identification dans Facebook et le client récupère un "jeton" qu'il peut présenter au serveur de ressources. Le serveur de ressources examine le jeton et l'accepte après avoir vérifié que Facebook l'a effectivement émis et autorise l'utilisateur à accéder à la ressource. Dans ce cas, le client ne voit jamais les informations d'identification de l'utilisateur (c'est-à-dire ses informations d'identification Facebook).
Mais disons que vous gérez les identités de vos utilisateurs (et avez un serveur d'autorisation) au lieu de Facebook, qui accorde déjà des jetons à votre client. Supposons maintenant que vous ayez également un partenaire et que vous souhaitiez autoriser son application (c'est-à-dire son client) à accéder à votre API REST. Avec l'authentification de base (ou même ROPC), l'utilisateur fournira des informations d'identification à ce client qui les enverra au serveur d'autorisation. Le serveur d'autorisation fournira alors un jeton qui peut être utilisé par le client pour accéder aux ressources. Malheureusement, cela signifie que les informations d'identification de l'utilisateur sont désormais visibles pour ce client également. Cependant, vous ne voudriez pas que l'application d'un partenaire (qui pourrait être externe à votre organisation) connaisse même le mot de passe d'un utilisateur. C'est un problème de sécurité maintenant. Pour atteindre cet objectif,
Ainsi, avec OAuth2, l'idéal serait de ne pas utiliser ROPC dans de tels cas plutôt d'utiliser un autre, comme le flux de code d'autorisation. Cela protège toute application de connaître les informations d'identification de l'utilisateur qui ne sont présentées qu'au serveur d'autorisation. Ainsi, les informations d'identification d'un utilisateur ne sont pas divulguées. Les mêmes problèmes s'appliquent à l'authentification de base, mais dans la section suivante, j'expliquerai comment ROPC est encore meilleur car les informations d'identification de l'utilisateur n'ont toujours pas besoin d'être stockées par le client dans ROPC pour un accès persistant par les clients.
Notez que lorsque l'utilisateur accède au serveur d'autorisation, le serveur d'autorisation peut également demander à l'utilisateur de confirmer qu'il souhaite autoriser le client à accéder aux ressources en son nom ou non. C'est pourquoi il est appelé serveur d'autorisation car le processus d'autorisation d'un client pour accéder aux ressources est impliqué dans le processus. Si l'utilisateur n'autorise pas le client, il n'aura pas accès aux ressources. De même, si l'utilisateur lui-même n'a pas accès aux ressources, le serveur d'autorisation peut toujours refuser l'accès et ne pas émettre de jeton.
Dans l'authentification de base, même le serveur d'autorisation et le serveur de ressources sont combinés en une seule entité. Ainsi, le serveur de ressources veut autoriser l'utilisateur, demande donc les informations d'identification du client. Le client fournit les informations d'identification utilisées par le serveur de ressources pour authentifier l'utilisateur. Cela signifie que plusieurs serveurs de ressources exigeront essentiellement des informations d'identification de l'utilisateur.
Émission de jetons
Les clients obtiennent des jetons du serveur d'autorisation, les conservent et les utilisent pour accéder aux ressources (plus de détails sur les jetons eux-mêmes ci-dessous). Les clients ne connaissent jamais le mot de passe de l'utilisateur (dans des flux autres que ROPC) et n'ont pas besoin de le stocker. Dans ROPC, même si les clients connaissent le mot de passe de l'utilisateur, ils n'ont toujours pas besoin de le stocker car ils utilisent ces jetons pour accéder aux ressources. En revanche, dans l'authentification de base, si un client ne souhaite pas que l'utilisateur fournisse des informations d'identification à chaque session, le client doit stocker le mot de passe de l'utilisateur afin de pouvoir le fournir la prochaine fois. C'est un inconvénient majeur de l'utilisation de l'authentification de base, sauf si le client n'est qu'une application Web, auquel cas les cookies peuvent répondre à certaines de ces préoccupations. Avec les applications natives, ce n'est généralement pas une option.
Il y a un autre aspect d'OAuth2 qui est impliqué dans la façon dont les jetons sont émis et fonctionnent. Lorsqu'un utilisateur fournit des informations d'identification au serveur d'autorisation (même dans ROPC), le serveur d'autorisation peut attribuer un ou plusieurs des deux types de jetons: 1) jeton d'accès et 2) jeton d'actualisation.
Les jetons d'accès sont envoyés au serveur de ressources qui accordera l'accès aux ressources après leur validation, et ils ont généralement une courte durée de vie, par exemple 1 heure. Les jetons d'actualisation sont envoyés au serveur d'autorisation par le client pour obtenir un autre jeton d'accès à son expiration, et ont généralement une grande durée de vie (par exemple quelques jours à plusieurs mois voire plusieurs années).
Lorsque le client fournit le jeton d'accès au serveur de ressources, il regarde le jeton et après validation, regarde à l'intérieur du jeton pour déterminer s'il autorise l'accès ou non. Tant que le jeton d'accès est valide, le client peut continuer à l'utiliser. Supposons que l'utilisateur ferme l'application et la démarre le lendemain, et le jeton d'accès a expiré. Le client va maintenant appeler le serveur d'autorisation et présenter le jeton d'actualisation en supposant qu'il n'est pas expiré. Le serveur d'autorisation, puisqu'il a déjà émis le jeton, le vérifie et peut déterminer que l'utilisateur n'a pas besoin de fournir à nouveau les informations d'identification et donne ainsi un autre jeton d'accès au client. Le client a à nouveau accès au serveur de ressources. C'est ainsi que les applications clientes pour Facebook et Twitter demandent généralement des informations d'identification une fois, puis ne demandent pas à l'utilisateur de fournir à nouveau les informations d'identification. Ces applications n'ont jamais besoin de connaître les informations d'identification des utilisateurs et peuvent néanmoins accéder aux ressources chaque fois que l'utilisateur démarre l'application.
L'utilisateur peut désormais accéder au serveur d'autorisation (par exemple dans son profil d'utilisateur Facebook), changer de mot de passe sans impact sur les applications clientes. Ils continueront tous à fonctionner correctement. Si l'utilisateur perd un appareil sur lequel il avait déjà une application avec des jetons d'actualisation, il peut demander au serveur d'autorisation (par exemple Facebook) de "se déconnecter" des applications que le serveur d'autorisation (par exemple Facebook) accomplira en n'honorant aucune actualiser les jetons et forcer l'utilisateur à fournir à nouveau des informations d'identification lorsqu'il essaie d'accéder aux ressources via ces applications.
JWT est simplement le format de jeton généralement utilisé avec OAuth2 et OpenID Connect. Les méthodes de signature et de validation du jeton sont également standardisées avec des bibliothèques disponibles pour ceux-ci au lieu que chaque serveur de ressources implémente une autre solution. Ainsi, l'avantage réside dans la réutilisabilité du code qui a été vérifié et continue d'être pris en charge.
Implications pour la sécurité
L'authentification de base sera plus faible lorsque l'un des scénarios ci-dessus apparaît dans l'image. Il existe également un modèle de menace étendu pour OAuth2 disponible pour les développeurs qui peuvent utiliser les suggestions qu'il contient pour éviter les vulnérabilités courantes dans leurs implémentations. Si vous passez par le modèle de menace, vous verrez que de nombreuses vulnérabilités liées à l'implémentation (telles que le redirecteur ouvert et CSRF) y sont également couvertes. Je ne suis pas passé par la comparaison de ceux contre l'authentification de base dans cette réponse.
Le dernier avantage majeur d'OAuth2 est que le protocole est standardisé et que plusieurs serveurs d'autorisation, clients et serveurs de ressources l'honorent. De nombreuses bibliothèques sont disponibles pour les développeurs, qui sont maintenues afin que des problèmes de sécurité soient trouvés dans les implémentations, les bibliothèques sont mises à jour tout en permettant l'interopérabilité.
Conclusion
Si vous écrivez une nouvelle application, IMO, le cas idéal serait d'éviter à la fois l'authentification de base et le ROPC en raison des problèmes inhérents à celles-ci. Cependant, chaque application a des besoins, des délais, des compétences de développeur, etc. différents, donc la décision est prise au cas par cas. Mais même si vous n'aviez pas plus besoin que l'authentification de base, en la choisissant, vous pourriez vous enfermer dans une architecture qui ne serait pas facile à étendre (par exemple si vous avez plusieurs serveurs à l'avenir, vous ne voudriez pas nécessairement avoir l'utilisateur fournit des informations d'identification à chacun d'eux plutôt qu'il suffit de fournir une fois au serveur d'autorisation, qui peut distribuer des jetons, etc.)
Notez que je n'ai pas répondu à votre commentaire sur la façon dont les informations d'identification sont envoyées par câble, car celles-ci peuvent être sécurisées à l'aide de TLS ou d'un protocole similaire, ou d'une preuve de possession, etc. être trompé par cela. Les différences mentionnées ci-dessus sont généralement au niveau architectural et c'est donc là que je me suis concentré car l'architecture est la plus difficile à changer une fois mise en œuvre.
Azure Active Directory B2C Basic , un service sur lequel je travaille et qui a récemment été publié en avant-première publique, permet à une application tierce d'utiliser AAD comme serveur d'autorisation avec interopérabilité avec les PDI sociaux (tels que Facebook, Google, etc.). Il permet également aux utilisateurs de créer leurs propres comptes au lieu d'utiliser des PDI sociaux et ceux-ci peuvent ensuite être utilisés à des fins d'authentification. Il y a quelques autres services comme ça (par exemple un autre que je connais est auth0) qui peut être utilisé par les développeurs pour externaliser complètement l'authentification et la gestion des utilisateurs pour leurs applications et ressources. Les mêmes caractéristiques de protocoles que j'ai mentionnées ci-dessus sont utilisées par les développeurs pour découpler le serveur d'autorisation (AAD), une ressource (par exemple leurs API REST), le client (par exemple leurs applications mobiles) et les utilisateurs. J'espère que cette explication aide un peu.