Échanger un jeton d'accès pour une session web

Introduction

OpenID Connect offre une multitude d'options pour l'authentification des utilisateurs et des appareils : des codes d'autorisation normaux aux justificatifs du client, en passant par le ROPC, et bien d'autres encore. Cependant, dans certains cas, vous êtes limité dans ce que vous pouvez faire une fois que vous vous êtes authentifié. Dans un flux d'octroi de code d'autorisation, votre session du côté du fournisseur d'identité peut avoir expiré mais vos jetons d'accès peuvent encore être valides. Dans un flux d'octroi ROPC, vous avez obtenu des droits pour interagir avec le fournisseur d'identité, mais vous n'avez jamais établi de session avec le navigateur, de sorte que si vous essayez d'aller ailleurs, vous n'avez pas de chance.

Dans ce scénario, nous utiliserons le flux de subventions ROPC avec IBM Verify pour obtenir un jeton d'accès, puis nous ferons un appel ajax à HTTP avec ce jeton et obtiendrons une session authentifiée établie avec IBM Verify. Une fois la session établie, les utilisateurs peuvent naviguer dans d'autres applications, tant SAML qu'OIDC, sans avoir à s'authentifier à nouveau directement auprès du fournisseur d'identité.

Remarque : pour l'instant, le contournement de CORS doit être activé via un plugin de navigateur. Je travaille actuellement sur une solution de contournement.

600

Nouveau point de terminaison de la session d'authentification

Sur IBM Verify, un point de terminaison de l'API permet de définir des cookies de session lorsqu'ils sont appelés à partir d'un navigateur :

GET /v1.0/auth/session

Lors de l'appel de cette API, un jeton d'accès valide doit être fourni dans l'en-tête Authorization HTTP:
'Autorisation : porteur {access_token} '

Une session web est créée pour l'utilisateur identifié par le jeton d'accès et un cookie permettant de maintenir cette session dans le navigateur est renvoyé.

Cette nouvelle API est assez simple à appeler en utilisant un appel ajax. Dans l'exemple de code ci-dessous, j'ai créé une fonction JavaScript, en fournissant le jeton d'accès que j'ai reçu, et en cas de réponse positive de l'appel API, j'envoie l'utilisateur au launchpad (qui est en soi une application OIDC) et aucune autre authentification ne m'est demandée (à moins qu'une authentification multifactorielle ne soit requise par votre politique de sécurité).

Exemple de flux de connexion basé sur un formulaire

J'ai mis au point un exemple d'application, pas plus de 160 lignes de code HTML/JS. Cette application ne fait qu'une chose, et une seule : connecter un utilisateur au launchpad à partir d'une application tierce.

Prérequis

Créer une nouvelle application OIDC pour le ROPC

Créez une nouvelle application personnalisée sur IBM Verify et sélectionnez OpenID Connect comme type. Activer l'octroi d'un mot de passe au propriétaire de la ressource (ROPC), avec un identifiant client public et sans secret. Pour ce flux, le secret n'est pas très utile car il s'agit d'une application frontale. Il ne serait pas vraiment privé de toute façon, car il n'y a pas de bonne option pour le cacher.

Ajoutez votre domaine aux domaines autorisés dans IBM Verify

Cette application est un site tiers, vous devrez donc ajouter votre serveur URL, qu'il s'agisse de localhost ou d'un domaine entièrement qualifié, à vos domaines autorisés.

Dans le portail d'administration de IBM Verify, naviguez jusqu'à l'onglet Configuration. Sous l'onglet Clients API, sélectionnez Domaines autorisés. Ajoutez votre domaine, votre port et tout ce qui est nécessaire pour autoriser CORS. Dans ce cas, j'utilise python pour créer un serveur HTTP sur le port 8000. J'ai ajouté http://localhost:8000 à ma liste de domaines autorisés.

Exemple de code