4D NetKit : Authentification OpenID sécurisée avec l’attribut nonce

Traduit automatiquement de Deepl

Lorsque l’on travaille avec des flux d’authentification modernes, la sécurité est primordiale. Les développeurs doivent souvent intégrer l’authentification avec des fournisseurs d’identité de confiance tels que Google ou Microsoft. C’est là que l ‘OpenID Connect (OIDC) entre en jeu.

OIDC est une couche d’identité construite au-dessus d’OAuth 2.0. Elle permet à votre application de vérifier l’identité d’un utilisateur et d’obtenir des informations de base sur son profil de manière sécurisée. En commençant par les dernières améliorations apportées à la classe cs.NetKit.OAuth2Provider 4D 21 facilite l’utilisation d’OpenID Connect en prenant en charge le paramètre nonce, ainsi que de nouveaux attributs de jeton, y compris le jeton id_token.

Lorsque vous demandez des champs d’application OAuth 2.0 standard, vous recevez un access_token, qui permet d’accéder aux API, mais qui ne vous indique pas l’identité de l’utilisateur. Pour identifier l’utilisateur, vous devez inclure la portée openid. Cela active la couche OpenID Connect et garantit que le fournisseur d’identité renvoie également un id_token.

Des champs d’application supplémentaires peuvent enrichir les informations contenues dans l’id_token :

  • openid → obligatoire, active OpenID Connect et fournit un id_token.
  • profile → optionnel, renvoie des informations de profil telles que le nom, le surnom et la photo.
  • email → optionnel, inclut l’adresse électronique de l’utilisateur.

 

Le paramètre nonce est spécifique aux demandes OpenID Connect. Il associe une session client au jeton d’identification renvoyé et contribue à la protection contre les attaques par rejeu.

  • Il est facultatif, mais fortement recommandé pour améliorer la sécurité.
  • La valeur est transmise sans modification de la demande d’authentification au jeton d’identification.

Qu’est-ce que le jeton d’identification ?

L’id_token est une propriété de l’objet token, renvoyé lorsque la portée openid est demandée. Il contient des informations sur l’identité de l’utilisateur au format JWT. Comme il est encodé sous forme de texte, vous devrez désérialiser le JWT afin de lire son contenu. Pour ce faire, vous pouvez utiliser la classe JWT contenue dans Netkit.

var $provider:={}
$provider.name:="Microsoft"
$provider.permission:="signedIn"
$provider.clientId:="xxxx"
$provider.redirectURI:="http://127.0.0.1:80/authorize/"
$provider.scope:="openid profile email" // request identity + profile info
$provider.nonce:="randomNonce456" // optional nonce value 

var $oauth:=cs.NetKit.OAuth2Provider.new($provider)
var $token:=$oauth.getToken()

// Access the id_token
If ($token.token.id_token#Null)

  // Deserialize the JWT result with cs.NetKit.JWT class
  var $openID:=cs.NetKit.JWT.new().decode($token.token.id_token)
  
  If ($openID.payload.nonce=$param.nonce)
     ALERT("Hello "+$openID.payload.name)
  End if 

End if 

//$openID={ 
//   header: {
//      typ: "JWT";
//      alg: "RS256";
//      kid: "HS23b7Do..."
//   };
//   payload: {
//      aud: "b6822251-7...";     // the clientId (your application).
//      iss: "https://login.microsoftonline.com/06dc191b-7348-4b66-b0d9-806cb7d9455b/v2.0";
//      iat: 1758537433;          // the time when the token was issued.
//      nbf: 1758537433;          // the earliest time when the token is considered valid.
//      exp: 1758541333;          // the token expiration time.
//      email: "your.name@outlook.com";
//      name: "Your Name";       
//      nonce: "randomNonce456";  // the value sent in the request to protect against replay attacks (if used).
//      oid: "064fd139-65...";    // the unique identifier of the user’s account in the identity provider’s directory
//      preferred_username: "your.name@outlook.com";
//      rh: "1.AV8AGxncBkhz...";  // refresh token handle
//      sid: "008cb789-7...";     // session ID
//      sub: "6RcYjA-CqS...";     // the unique identifier of the user
//      tid: "06dc191b-73...";    // identifies the tenant (organization)
//      uti: "sS7qSOW0...";       // unique token identifier
//      ver: "2.0"
//   };
//   signature": "gy4AwVunCf_NbeUP..."
//}

conclusion

Avec l’introduction du support des nonce et id_token, 4D simplifie l’intégration d’OpenID Connect. En demandant les bons scopes et en décodant l’id_token, vos applications peuvent authentifier les utilisateurs en toute sécurité tout en accédant à des informations d’identité fiables.

Fabrice Mainguené
- Product Owner -Fabrice Mainguené a rejoint l'équipe du programme 4D en novembre 2016. En tant que Product Owner, il est en charge de rédiger les user stories puis de les traduire en spécifications fonctionnelles. Son rôle est également de s'assurer que l'implémentation de la fonctionnalité livrée répond au besoin du client.Après avoir obtenu une licence en informatique au CNAM, Fabrice a rejoint une petite société d'édition de logiciels en tant que développeur Windev. Il a ensuite travaillé pour différentes entreprises dans les domaines de l'industrie et du commerce en tant que développeur Windev et web ainsi que conseiller technique sur les nouvelles fonctionnalités.