4D NetKit: autenticación OpenID segura con el atributo nonce

Cuando se trabaja con flujos de autenticación modernos, la seguridad es primordial. A menudo, los desarrolladores necesitan integrar la autenticación con proveedores de identidad de confianza, como Google o Microsoft. Aquí es donde OpenID Connect (OIDC) entra en juego.

OIDC es una capa de identidad construida sobre OAuth 2.0. Permite que su aplicación verifique la identidad del usuario. Permite a su aplicación verificar la identidad de un usuario y obtener información básica de su perfil de forma segura. A partir de las últimas mejoras de la clase cs.NetKit.OAuth2Provider 4D 21 facilita el trabajo con OpenID Connect al soportar el parámetro nonce, junto con nuevos atributos de token, incluyendo id_token.

Cuando usted solicita alcances OAuth 2.0 estándar, recibirá un access_token, que sirve para acceder a las APIs pero no le dice quién es el usuario. Para identificar al usuario, debe incluir el ámbito openid. Esto activa la capa OpenID Connect y garantiza que el proveedor de identidad también devuelva un id_token.

Los campos de aplicación adicionales pueden enriquecer la información incluida en el id_token:

  • openid → obligatorio, activa OpenID Connect y proporciona un id_token.
  • profile → opcional, devuelve información de perfil como nombre, sobre nombre y foto.
  • email → opcional, incluye la dirección de correo electrónico del usuario.

 

El parámetro nonce es específico de las solicitudes OpenID Connect. Asocia una sesión de cliente con el token de ID devuelto y ayuda a proteger contra ataques de repetición.

  • Es opcional, pero se recomienda encarecidamente para mejorar la seguridad.
  • El valor se pasa sin modificar desde la solicitud de autenticación al token de ID.

¿Qué es el ID_Token?

El id_token es una propiedad del objeto token, devuelta cuando se solicita el ámbito openid. Contiene información sobre la identidad del usuario en formato JWT. Dado que está codificado como texto, necesitará deserializar el JWT para leer su contenido. Para ello, puede utilizar la clase JWT contenida en 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..."
//}

conclusión

Con la introducción del soporte para nonce e id_token, 4D simplifica la integración de OpenID Connect. Solicitando los ámbitos correctos y decodificando el id_token, sus aplicaciones pueden autenticar usuarios de forma segura mientras acceden a información de identidad fiable.

Fabrice Mainguené
- Product Owner -Fabrice Mainguené se unió al equipo de 4D Program en noviembre de 2016. Como Product Owner, está a cargo de escribir las historias de usuario y luego traducirlas a especificaciones funcionales. Su papel es también asegurarse de que la implementación de la característica entregada cumple con las necesidades del cliente. Después de obtener una licenciatura en Ciencias de la Computación en el CNAM, Fabrice se unió a una pequeña empresa de publicación de software como desarrollador Windev. A continuación, trabajó para diferentes empresas del sector industrial y comercial como desarrollador de Windev y de la web, así como asesor técnico de nuevas funcionalidades.