4D NetKit: Bezpečné ověřování OpenID pomocí atributu nonce

Automaticky přeloženo z Deepl

Při práci s moderními ověřovacími toky je nejdůležitější zabezpečení. Vývojáři často potřebují integrovat ověřování s důvěryhodnými poskytovateli identit, jako je Google nebo Microsoft. Zde přichází ke slovu OpenID Connect (OIDC).

OIDC je vrstva identit postavená nad protokolem OAuth 2.0. Umožňuje aplikaci bezpečně ověřit identitu uživatele a získat základní informace o profilu. Počínaje nejnovějšími vylepšeními pro cs.NetKit.OAuth2Provider 4D 21 nyní usnadňuje práci s OpenID Connect tím, že podporuje parametr nonce spolu s novými atributy tokenu, včetně id_token.

Při vyžádání standardních rozsahů OAuth 2.0 obdržíte access_token, který je určen pro přístup k rozhraní API, ale neříká, kdo je uživatel. Chcete-li identifikovat uživatele, musíte zahrnout obor openid. Tím se aktivuje vrstva OpenID Connect a zajistí se, že poskytovatel identity vrátí také id_token.

Další obory mohou obohatit informace obsažené v id_tokenu:

  • openid → povinné, aktivuje OpenID Connect a poskytuje id_token.
  • profile → nepovinné, vrací informace o profilu, jako je jméno, přezdívka a obrázek.
  • email → nepovinné, obsahuje e-mailovou adresu uživatele.

Parametr nonce je specifický pro požadavky OpenID Connect. Spojuje relaci klienta s vráceným ID Tokenem a pomáhá chránit před útoky typu replay.

  • Je nepovinný, ale důrazně se doporučuje pro lepší zabezpečení.
  • Hodnota se předává z požadavku na ověření do ID Tokenu v nezměněné podobě.

Co je ID_Token?

ID_token je vlastnost objektu tokenu, která se vrací při požadavku na obor openid. Obsahuje informace o identitě uživatele ve formátu JWT. Protože je zakódován jako text, budete muset JWT deserializovat, abyste mohli přečíst jeho obsah. K tomu můžete použít třídu JWT obsaženou v sadě 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..."
//}

závěr

Zavedením podpory nonce a id_token zjednodušuje 4D integraci OpenID Connect. Vyžádáním správných rozsahů a dekódováním id_tokenu mohou vaše aplikace bezpečně ověřovat uživatele a zároveň přistupovat ke spolehlivým informacím o identitě.

Fabrice Mainguené
- Product Owner -Fabrice Mainguené se připojil k týmu 4D Program v listopadu 2016. Jako Product Owner má na starosti psaní uživatelských příběhů, které následně převádí do funkčních specifikací. Jeho úkolem je také zajistit, aby dodaná implementace funkcí splňovala potřeby zákazníků.Po získání bakalářského titulu v oboru informatiky na CNAM nastoupil Fabrice do malé softwarové vydavatelské společnosti jako vývojář Windev. Poté pracoval pro různé společnosti v oblasti průmyslu a obchodu jako vývojář aplikací Windev a webových aplikací a také jako technický poradce pro nové funkce.