4D NetKit: Sichere OpenID-Authentifizierung mit nonce-Attribut

Automatisch übersetzt von Deepl

Bei der Arbeit mit modernen Authentifizierungsabläufen steht die Sicherheit an erster Stelle. Entwickler müssen häufig die Authentifizierung mit vertrauenswürdigen Identitätsanbietern wie Google oder Microsoft integrieren. An dieser Stelle kommt OpenID Connect (OIDC) ins Spiel.

OIDC ist eine Identitätsschicht, die auf OAuth 2.0 aufbaut. Sie ermöglicht es Ihrer Anwendung, die Identität eines Benutzers zu überprüfen und grundlegende Profilinformationen auf sichere Weise zu erhalten. Mit den jüngsten Erweiterungen der cs.NetKit.OAuth2Provider Klasse erleichtert 4D 21 nun die Arbeit mit OpenID Connect durch die Unterstützung des nonce-Parameters und neuer Token-Attribute, einschließlich des id_token.

Wenn Sie Standard-OAuth-2.0-Bereiche anfordern, erhalten Sie ein access_token, das für den Zugriff auf APIs gedacht ist, aber keine Auskunft über den Benutzer gibt. Um den Benutzer zu identifizieren, müssen Sie den openid-Bereich einschließen. Dadurch wird die OpenID-Connect-Schicht aktiviert und sichergestellt, dass der Identitätsanbieter ebenfalls ein id_token zurückgibt.

Zusätzliche Scopes können die im id_token enthaltenen Informationen anreichern:

  • openid → erforderlich, aktiviert OpenID Connect und liefert einen id_token.
  • profile → optional, gibt Profilinformationen wie Name, Spitzname und Bild zurück.
  • email → optional, enthält die E-Mail-Adresse des Benutzers.

Der nonce-Parameter ist spezifisch für OpenID Connect-Anfragen. Er assoziiert eine Client-Sitzung mit dem zurückgegebenen ID-Token und hilft, sich gegen Wiederholungsangriffe zu schützen.

  • Er ist optional, wird aber für eine verbesserte Sicherheit dringend empfohlen.
  • Der Wert wird unverändert von der Authentifizierungsanfrage an das ID Token weitergegeben.

Was ist das ID_Token?

Der id_token ist eine Eigenschaft des Token-Objekts, die bei der Anforderung des openid-Bereichs zurückgegeben wird. Er enthält Informationen zur Benutzeridentität im JWT-Format. Da es als Text kodiert ist, müssen Sie das JWT deserialisieren, um seinen Inhalt lesen zu können. Dazu können Sie die in Netkit enthaltene JWT-Klasse verwenden.

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..."
//}

Schlussfolgerung

Mit der Einführung der Unterstützung von nonce und id_token vereinfacht 4D die Integration von OpenID Connect. Durch die Abfrage der richtigen Scopes und die Dekodierung des id_token können Ihre Anwendungen Benutzer sicher authentifizieren und gleichzeitig auf zuverlässige Identitätsinformationen zugreifen.

Fabrice Mainguené
- Product Owner -Fabrice Mainguené gehört seit November 2016 zum 4D Program Team. Als Product Owner ist er verantwortlich für das Schreiben der User Stories und deren Umsetzung in funktionale Spezifikationen. Seine Aufgabe ist es auch, sicherzustellen, dass die gelieferte Funktionsimplementierung den Kundenanforderungen entspricht.Nach seinem Bachelor-Abschluss in Informatik am CNAM arbeitete Fabrice als Windev-Entwickler bei einem kleinen Software-Verlag. Danach arbeitete er für verschiedene Unternehmen in Industrie und Handel als Windev- und Webentwickler sowie als technischer Berater für neue Funktionen.