Sans OAuth2, pour donner un accès à une application tierce, il faut y stocker en clair les identifiants de l’utilisateur. Cette pratique entraîne de nombreux risques en cas de compromission, de plus il est impossible de limiter les droits de l’application de façon standardisée. Par ailleurs, identifier l’entité souhaitant accéder aux ressources s’avère compliqué, ouvrant donc la porte aux abus (i.e. Identity Spoofing) et laissant l’utilisateur et le Système d’Informations sans défense.
L’utilisation de OAuth2 permet de mettre en place une délégation d’autorisation pour accorder à une application tierce un accès limité sur une ressource, avec l’accord du propriétaire de celle-ci. Il n’y a alors plus besoin de stocker les identifiants de l’utilisateur dans les applications tierces.
OAuth2 : les coulisses
OAuth2 repose sur des échanges entre 4 acteurs. L’utilisateur, ici nommé Resource Owner, est capable d’accorder l’accès à la ressource pour une application nommée Client.
L’Authorization Server occupe le rôle central au sein du protocole, il est chargé d’authentifier le Resource Owner et de délivrer son autorisation sous la forme d’un jeton appelé access token. Le Resource Server quant à lui correspond au serveur où sont stockées les ressources protégées.
La confiance au cœur des échanges
Le protocole adresse des situations de sécurité différenciées en fonction de 2 types de clients :
- Un client confidentiel est une application ou un service back-end installé dans une zone sécurisée. Ainsi, ses identifiants et tokens ne sont pas exposés au Resource Owner.
- Un client public est généralement installé et exécuté sur la machine du Resource Owner ou exécuté par le navigateur (front-end), il est donc possible pour les personnes et les programmes ayant accès à la machine d’accéder aux identifiants et aux tokens du client.
Un client confidentiel voit son accès aux ressources protégées facilité. Cela nécessite cependant qu’il soit capable de garantir la confidentialité de ses identifiants et des tokens délivrés. Lors de leur enregistrement auprès de l’Authorization Server, tous les clients reçoivent un client id ainsi qu’un client secret pour les clients confidentiels.
De l‘autorisation à l’identification
OAuth2 offre plusieurs méthodes afin d’accéder à des ressources via la réception d’un jeton d’accès (access token).
Pour autoriser une application à accéder aux ressources, le Resource Owner doit s’authentifier auprès de l’Authorization Server.
A la différence de l’identification qui consiste à donner son identité, l’authentification prouve cette identité à travers différents moyens tels que le mot de passe, la biométrie, etc…
Token : Le sauf-conduit 2.0
L’access token est l’élément utilisé pour accéder à une ressource protégée. Accordé par le Resource Owner et délivré par l’Authorization Server, il permet d’obtenir les privilèges accordés au client (i.e. scope) et la durée de vie de cette autorisation. Il est généralement de courte durée.
Le refresh token est l’élément utilisé pour obtenir un nouvel access token, sans interaction avec l’utilisateur. Il n’est délivré qu’aux clients confidentiels. Son utilisation nécessite uniquement l’authentification du client et non plus celle du Resource Owner. Grâce au refresh token, l’utilisateur n’est pas contraint de s’authentifier régulièrement, améliorant ainsi son expérience.
Il existe 2 implémentations possibles de tokens : les tokens classiques, aussi appelés opaques, et les self-contained tokens.
- Les tokens classiques sont des chaines de caractères inintelligibles pour l’utilisateur. Seuls les Authorization Servers sont capables de les exploiter (comprendre ici, de les associer à un scope). Ces tokens nécessitent la mise en place d’une cinématique d’échange entre l’Authorization Server, qui délivre les tokens, et le Resource Server qui les reçoit. En effet, le Resource Server est incapable de déterminer si l’access token est valable pour la requête du client.
Le Resource Server effectue un appel vers l’Authorization Server avec le token. Celui-ci retourne alors les informations représentées par ce token parmi lesquels le scope, la validité et l’identité du client à laquelle il a été délivré. Cela permet au Resource Server de valider ou non la requête du client.
L’ID Token avec OpenID Connect
L’ID token est spécifique à OIDC. C’est un JSON Web Token (JWT) qui permet de diffuser l’identité d’un utilisateur qui s’est authentifié auprès d’un OpenID Provider. Il est délivré par l’OpenID Provider en même temps que l’access token.
Un claim est une paire « clé / valeur » qui représente une partie des informations du Ressource Owner. Ainsi, l’ID token est composé d’un ensemble de claims qui définissent le contexte d’authentification mais aussi des informations personnalisables sur l’utilisateur comme son nom, son email ou son numéro de téléphone.
Il est découpé de la façon suivante :
Il définit le type de token et l’algorithme de hashage utilisé.
Il contient des informations concernant :
- L’identité d’un Resource Owner
- L’Authorization Server émetteur
- Le token (date de création, durée de validité …)
Hash du header et du payload chiffré avec la clé secrète de l’OpenID Provider.
Figure 1 – Exemple de réponse du Endpoint : /.well-known/openid-configuration
L’identité du End User
Relying Party
On a vu que, pour l’identité du End User, les Relying Party peuvent se reposer sur l’ID Token. Cependant, ce token ne correspond qu’à un état des informations d’identité à l’instant de sa génération. Ainsi, si le End User change son numéro de téléphone, l’ID Token sera toujours valide mais ne sera plus à jour.
Pour permettre de rafraîchir ces informations, l’OpenID Provider expose un autre service, le userinfo_endpoint. Ce service permet de récupérer les informations récentes sur le End User, ainsi que d’éventuelles informations complémentaires à l’ID Token. Ce service n’est accessible que via une requête portant un Access Token.
Figure 2 – Exemple basique d’une réponse du userinfo_endpoint
Resource Server
Le transfert de l’identité du End User aux Resource Servers dépend de l’Architecture mise en place, de la présence ou non d’une solution d’API Management, de la politique de développement du Resource Server ou encore de la confiance existant entre les différents acteurs.
Voici quelques exemples de process rencontrés chez nos clients :
- Transfère de l’ID Token au Resource Server en plus d’un access Token. Charge au Resource Server de valider les tokens et de les exploiter. Il dispose ainsi de l’identité du End User (ID Token) et de son périmètre d’action (access Token).
- Les requêtes contiennent uniquement l’access Token (et pas ID Token). Charge au Resource Server de demander à l’OpenID Provider les informations dont il a besoin (userinfo Endpoint).
- Utilisation d’une API Gateway qui se chargera de récupérer les informations auprès de l’OpenId Provider pour enrichir ensuite la requête avec des éléments d’identité pour le Resource Server.
Cet article nous a permis de présenter la surcouche OpenID Connect qui permet d’adresser les aspects inhérents à l’authentification et l’identification des End User.
Dans le prochain article, nous verrons comment ces protocoles s’utilisent et dans quels cas d’usage.