• Torna all'API Reference
  • Autenticazione
  • Autenticazione Microsoft Entra ID
  • Autenticazione myjosh HUB

Autenticazione

La sicurezza degli accessi è gestita, ad ogni chiamata di una API (salvo ove indicato), nel modo seguente:
  1. Si verifica se è richiesta la validazione dell’utente chiamante (parametro generale): se non richiesta, non viene eseguita alcuna validazione dell’utente, altrimenti si procede come indicato nei punti seguenti
  2. Si individua il nome dell’utente chiamante (vari meccanismi di autenticazione Windows/Azure/OAuth2) e si verifica che l’utente sia definitio nel database di josh Protocol!
  3. In base all’operazione richiesta, si verifica se l’utente ha i permessi necessari alla sua esecuzione

Autenticazione Microsoft Entra ID

Normalmente, in una installazione on-premises, le API di josh Protocol! sono raggiungibili con autenticazione NTLM. Quando invece josh Protocol! è installato in cloud, su Azure, allora l’autenticazione è Microsoft Entra ID. In questo caso la chiamata deve essere corredata dal passaggio del token di autenticazione su Entra ID:

Esempio di chiamata cUrl con token Entra ID:

curl --location --request GET 'http://myJpWebServer/joshProtocolRestAPI/api/protocolli/10' \
--header 'Authorization: Bearer eyJ0eXAiOiJKV1Q...B47eHwbh6KA'

Esempio di chiamata cUrl per ottenere il token Entra ID:

curl --location --request POST 'https://login.microsoftonline.com/ /oauth2/v2.0/token' \
--header 'Cookie: fpc=Aj6bRkR6u3pEqQHwWXoBroYl5X5pAQAAAMf66NgOAAAA; stsservicecookie=estsfd; x-ms-gateway-slice=estsfd' \
--form 'grant_type="password"' \
--form 'scope="openid /.default"' \
--form 'client_id=" "' \
--form 'username=" "' \
--form 'password=""'

La stessa cosa vale anche nel caso si utilizzi un certificato o un secret. Il client id passato alla chiamata di login sarà sempre quello dell’appllicazione chiamante, mentre tra gli scope ci deve essere quello relativo a josh Protocol! in cui viene passato il client id di josh Protocol! e il suffisso “./default”.

Autenticazione myjosh HUB

Josh Protocol! può essere configurato per utilizzare l’endpoint OAuth2 messo a disposizione da myjosh. Quando è attiva una configurazione di questo tipo, è necessario passare un token di autorizzazione, come nel caso di Microsoft Entra ID. Questo token però deve essere richiesto all’endpoint di autenticazione di myjosh e può essere ottenuto in due modi distinti.

Generazione token tramite client id e secret

E’ possibile ottenere il token di autorizzazione dell’endpoint myjosh, utilizzando il client id e il client secret di una app registration definita su myjosh. Per ottenere il token tramite client id e secret la chiamata da fare è la seguente:

curl --location --request POST ' https://MYJOSH_URL/authenticator/oauth2/token' \
--form 'grant_type="client_credentials"' \
--form 'client_id=" "' \
--form 'client_secret=" "' \
--form 'scope="service_account"'

Generazione token tramite certificato

La seconda modalità per ottenere un access token dall’endpoint di autorizzazione di myjosh è quella che utilizza un certificato. E’ necessario generare una client assertion firmata con un certificato. Lato app registration di myjosh, andrà impostato, nella sezione dell’utente di servizio, il certificato contenente la chiave pubblica del certificato utilizzato per firmare la client assertion. In questo modo myjosh sarà in grado di verificare la firma dell’assertion. Il frammento seguente di codice c# mostra come generare la client assertion:

var cert = new X509Certificate2(@"PATH_CERTIFICATO", "PASSWORD", X509KeyStorageFlags.Exportable);
RSA rsaProv = cert.GetRSAPrivateKey();
var expires = DateTime.UtcNow.AddMinutes(5);
var handler = new JwtSecurityTokenHandler();
var token = handler.CreateToken(new SecurityTokenDescriptor
{
  Issuer = "APP_REDIRECT_URI",
  Audience = "APP_CLIENT_ID",
  NotBefore = DateTime.UtcNow,
  Expires = expires,
  SigningCredentials = new SigningCredentials(new RsaSecurityKey(rsaProv), SecurityAlgorithms.RsaSha256)
});
// Generazione client assertion
var clientAssertion = handler.WriteToken(token);

Una volta ottenuta la client assertion si procederà alla chiamata verso l’endpoint myjosh in modo del tutto analogo a quanto visto nel paragrafo precedente:

curl --location --request POST ' https://MYJOSH_URL/authenticator/oauth2/token' \
--form 'grant_type="client_credentials"' \
--form 'client_id=" "' \
--form 'scope="service_account"' \
--form 'client_assertion_type="urn:ietf:params:oauth:client-assertion-type:jwt-bearer"' \
--form 'client_assertion=""'

Il token ottenuto sarà relativo all’utente di servizio associato all’app registration di myjosh individuata dal client ID. Una volta ottenuto l’access token è sufficiente passarlo nell’header come visto nel paragrafo precedente:

curl --location --request GET 'http://myJpWebServer/joshProtocolRestAPI/api/protocolli/10' \
--header 'Authorization: Bearer eyJ0eXAiOiJKV1Q...B47eHwbh6KA'