Pré-requis

  • Être familier des notions de Single Sign-On (SSO) et plus particulièrement OAuth2

  • Connaitre les bases du protocoles HTTP (query parameter, GET / POST, en-têtes)

  • Savoir utiliser un client HTTP tel que cURL ou un plugin navigateur équivalent 

Démarche

Ce document propose un démarche d'intégration SSO (Single Sign-On) d’une application tiers en s’appuyant sur le protocole OAuth 2.0 

1 - Choisir un flot d’authentification OAuth2

La plateforme Édifice propose un serveur OAuth2 qui supporte les "flots" suivant :

Le flot Authorization Code est le plus couramment utilisé

2 - Enregistrer l’application cliente sur la plateforme Édifice

Si vous êtes un éditeur ou un exploitant d’application, demandez au Support Édifice d’enregistrer votre application

Depuis la console d(administration d’une plateforme Édifice créer un connecteur de type OAuth2

Champs à configurer :

Informations à transmettre à l'éditeur de l'application cliente :

Informations à récupérer de l'éditeur de l'application cliente

3 : Tester l’accès Oauth2 de votre application client

Voici la procédure de test, une fois le paramétrage réalisé, il consiste à simuler l'ensemble des requêtes nécessaire à l'obtention des données de l'usager connecté.

Authorization Code

1 : Récupérer code de génération du token 

Dans un navigateur, entrer l'adresse : 

https://domaine.ent/auth/oauth2/auth?response_type=code&state=blip&scope=userinfo&client_id=duck&redirect_uri=http://duckduckgo.com
https://www.duckduckgo.com/?code=9ddf3256-7e5d-4708-a121-dfbe5f6dba75&state=blip

2 - Récupérer le token

 curl -i -X POST -H "Authorization:Basic ZmFxMnNjaWVuY2VzOmZhcTJzY2llbmNlcy1zZWNyZXQ=" -H "Content-Type:application/x-www-form-urlencoded" -H "Accept:application/json; charset=UTF-8" -d "grant_type=authorization_code&code=9ddf3256-7e5d-4708-a121-dfbe5f6dba75&redirect_uri=http%3A%2F%2Fduckduckgo.com" https://domaine.ent/auth/oauth2/token

Il faut authentifier en Basic le client OAuth2. Donc il passer une entête d’authentification qui respecte la convention suivante "Authorization:Basic encode_base64(client_id:client_secret)".

lire : https://datatracker.ietf.org/doc/html/rfc7617


En cas de succes le serveur oAuth2 de l'ENT transmet le token

HTTP/1.1 200 OK
      Content-Type: application/json

      {"token_type":"Bearer","access_token":"1413b31c-b240-453a-bc1e-3773cd31adc9","refresh_token":"9e746d64-3fa8-4ff8-88b3-2d8314f56179","expires_in":3600,"scope":"userinfo"}

3 : Accéder à une ressource de l’utilisateur depuis l’application cliente

Dans cet exemple nous collectons des informations d’identités de l’utilisateurs sur le endpoints /userinfo

curl -i -H "Authorization:Bearer 7acb83b1­53bd­4105­9b46­5acfb095158f" https://domaine.ent/auth/oauth2/userinfo 

Dans l'en-tête "Authorization:Bearer " il faut passer le token

En cas de succès le serveur OAuth2 de l'ENT transmet la ressource de l’utilisateur demandée

HTTP/1.1 200 OK
Content-Type: application/json

{
    "level":"",
    "login":"severine.alexandre",
    "lastName":"ALEXANDRE",
    "firstName":"SEVERINE",
    "externalId":"5555959",
    "username":"SEVERINE ALEXANDRE",
    "type":"ENSEIGNANT",
    "childrenIds":[],
    "uai":["0805432C"],
    "userId":"2bacdfd2-b59c-4b21-a23e-f6346e02fc4a",
    "classId":"55567$3ARMS",
    "schoolName":"Collège Denis Poisson"
}

Resource Owner Passwword

1 - Récupérer le token

curl --location --globoff 'https://domaine.ent/auth/oauth2/token' \
    --data-urlencode 'grant_type=password' \
    --data-urlencode 'username={USERNAME}' \
    --data-urlencode 'password={PASSWORD}' \
    --data-urlencode 'scope={SCOPE}' \
    --data-urlencode 'client_id={CLIENT_ID}' \
    --data-urlencode 'client_secret={CLIENT_SECRET}'

En cas de succes le serveur oAuth2 de l'ENT transmet le token

HTTP/1.1 200 OK
      Content-Type: application/json

      {"token_type":"Bearer","access_token":"1413b31c-b240-453a-bc1e-3773cd31adc9","refresh_token":"9e746d64-3fa8-4ff8-88b3-2d8314f56179","expires_in":3600,"scope":"userinfo"}

3 - Accéder à une ressource de l’utilisateur depuis l’application cliente

Dans cet exemple nous collectons des informations d’identités de l’utilisateurs sur le endpoints /userinfo

curl ­-i ­-H "Authorization:Bearer 7acb83b1­53bd­4105­9b46­5acfb095158f" https://domaine.ent/auth/oauth2/userinfo 

Dans l'en-tête "Authorization:Bearer " il faut passer le token

En cas de succes le serveur OAuth2 de l'ENT transmet la ressource de l’utilisateur démandée

HTTP/1.1 200 OK
Content-Type: application/json

{
    "level":"",
    "login":"severine.alexandre",
    "lastName":"ALEXANDRE",
    "firstName":"SEVERINE",
    "externalId":"5555959",
    "username":"SEVERINE ALEXANDRE",
    "type":"ENSEIGNANT",
    "childrenIds":[],
    "uai":["0805432C"],
    "userId":"2bacdfd2-b59c-4b21-a23e-f6346e02fc4a",
    "classId":"55567$3ARMS",
    "schoolName":"Collège Denis Poisson"
}

Json Web Token - Bearer :

Via les informations du JWT il est possible d’obtenir les informations authentification :

Documentation officielle :

https://datatracker.ietf.org/doc/html/rfc7523

1 - Informations à récupérer de l'éditeur de l'application cliente : ( Supplémentaire )

Screenshot 2024-04-22 at 10-53-01 Console d'administration.png

2 - Une fois la configuration dans la console administrateur : Récupération du token

curl --location --request POST 'https://domaine.ent/auth/oauth2/token' \
    --data-urlencode 'grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer' \
    --data-urlencode 'redirect_uri=https://www.duckduckgo.com' \
    --data-urlencode 'client_id={YOUR_CLIENT_ID}' \
    --data-urlencode 'client_secret={YOUR_SECRET}' \
    --data-urlencode 'assertion={YOUR_JSON_WEB_TOKEN}' \
    --data-urlencode 'scope={SCOPE}'

3 - En cas de succes le serveur OAuth2 de l'ENT transmet l’Access Token

{
    "token_type": "Bearer",
    "access_token": "5459a598-72f0-482c-b54a-fd44e92af5da",
    "expires_in": 3600,
    "scope": "email userinfo"
}