ID verificato di Microsoft Entra include l'API REST del servizio di richiesta. Questa API consente di rilasciare e verificare le credenziali. Questo articolo illustra come iniziare a usare l'API REST del servizio di richiesta.
Token di accesso api
L'applicazione deve includere un token di accesso valido con le autorizzazioni necessarie in modo che possa accedere all'API REST del servizio di richiesta. I token di accesso emessi da Microsoft Identity Platform contengono informazioni (ambiti) usate dall'API REST del servizio di richiesta per convalidare il chiamante. Un token di accesso garantisce che il chiamante disponga delle autorizzazioni appropriate per eseguire l'operazione richiesta.
Per ottenere un token di accesso, l'app deve essere registrata con Microsoft Identity Platform ed essere autorizzata da un amministratore per l'accesso all'API REST del servizio di richiesta. Se non è stata registrata l'applicazione verificabile-credentials-app , vedere come registrare l'app e quindi generare un segreto dell'applicazione.
Ottenere un token di accesso
Usare il flusso di concessione delle credenziali client OAuth 2.0 per acquisire il token di accesso usando Microsoft Identity Platform. Usare una libreria attendibile a questo scopo. In questa esercitazione si usa Microsoft Authentication Library (MSAL). MSAL semplifica l'aggiunta di autenticazione e autorizzazione a un'app che può chiamare un'API Web sicura.
POST /{tenant}/oauth2/v2.0/token HTTP/1.1 //Line breaks for clarity
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded
client_id=00001111-aaaa-2222-bbbb-3333cccc4444
&scope=3db474b9-6a0c-4840-96ac-1fceb342124f/.default
&client_secret=sampleCredentia1s
&grant_type=client_credentials
// Initialize MSAL library by using the following code
ConfidentialClientApplicationBuilder.Create(AppSettings.ClientId)
.WithClientSecret(AppSettings.ClientSecret)
.WithAuthority(new Uri(AppSettings.Authority))
.Build();
// Acquire an access token
result = await app.AcquireTokenForClient(AppSettings.Scopes)
.ExecuteAsync();
// Initialize MSAL library by using the following code
const msalConfig = {
auth: {
clientId: config.azClientId,
authority: `https://login.microsoftonline.com/${config.azTenantId}`,
clientSecret: config.azClientSecret,
},
system: {
loggerOptions: {
loggerCallback(loglevel, message, containsPii) {
console.log(message);
},
piiLoggingEnabled: false,
logLevel: msal.LogLevel.Verbose,
}
}
};
const cca = new msal.ConfidentialClientApplication(msalConfig);
const msalClientCredentialRequest = {
scopes: ["3db474b9-6a0c-4840-96ac-1fceb342124f/.default"],
skipCache: false,
};
module.exports.msalCca = cca;
module.exports.msalClientCredentialRequest = msalClientCredentialRequest;
// Acquire an access token
const result = await mainApp.msalCca.acquireTokenByClientCredential(mainApp.msalClientCredentialRequest);
if ( result ) {
accessToken = result.accessToken;
}
# Initialize MSAL library by using the following code
msalCca = msal.ConfidentialClientApplication( config["azClientId"],
authority="https://login.microsoftonline.com/" + config["azTenantId"],
client_credential=config["azClientSecret"],
)
# Acquire an access token
accessToken = ""
result = msalCca.acquire_token_for_client( scopes="3db474b9-6a0c-4840-96ac-1fceb342124f/.default" )
if "access_token" in result:
accessToken = result['access_token']
// Initialize MSAL library by using the following code
ConfidentialClientApplication app = ConfidentialClientApplication.builder(
clientId,
ClientCredentialFactory.createFromSecret(clientSecret))
.authority(authority)
.build();
// Acquire an access token
ClientCredentialParameters clientCredentialParam = ClientCredentialParameters.builder(
Collections.singleton(scope))
.build();
CompletableFuture<IAuthenticationResult> future = app.acquireToken(clientCredentialParam);
IAuthenticationResult result = future.get();
return result.accessToken();
Nel codice precedente specificare i parametri seguenti:
Parametro
Condizione
Descrizione
Autorità
Richiesto
Tenant della directory in cui l'applicazione prevede di operare. Ad esempio: https://login.microsoftonline.com/{your-tenant}. Sostituire your-tenant con l'ID tenant o il nome.
Client ID
Richiesto
ID applicazione assegnato all'app. È possibile trovare queste informazioni nella portale di Azure, in cui è stata registrata l'app.
Segreto client
Richiesto
Segreto client generato per l'app.
Ambiti
Richiesto
Deve essere impostato su 3db474b9-6a0c-4840-96ac-1fceb342124f/.default. Questa impostazione produce un token di accesso con un'attestazione di ruoli di VerifiableCredential.Create.All.
Per altre informazioni su come ottenere un token di accesso usando l'identità di un'app console, vedere uno degli articoli seguenti:
POST /{tenant}/oauth2/v2.0/token HTTP/1.1 //Line breaks for clarity
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded
client_id=00001111-aaaa-2222-bbbb-3333cccc4444
&scope=3db474b9-6a0c-4840-96ac-1fceb342124f/.default
&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
&client_assertion=eyJhbGciOiJSUzI1NiIsIng1dCI6Imd4OHRHeXN5amNScUtqRlBuZDdSRnd2d1pJMCJ9.eyJ{a lot of characters here}M8U3bSUKKJDEg
&grant_type=client_credentials
// Initialize MSAL library by using the following code
X509Certificate2 certificate = AppSettings.ReadCertificate(AppSettings.CertificateName);
app = ConfidentialClientApplicationBuilder.Create(AppSettings.ClientId)
.WithCertificate(certificate)
.WithAuthority(new Uri(AppSettings.Authority))
.Build();
// Acquire an access token
result = await app.AcquireTokenForClient(AppSettings.Scopes)
.ExecuteAsync();
// Initialize MSAL library by using the following code
const msalConfig = {
auth: {
clientId: config.azClientId,
authority: `https://login.microsoftonline.com/${config.azTenantId}`,
clientCertificate: {
thumbprint: "CERT_THUMBPRINT", // a 40-digit hexadecimal string
privateKey: "CERT_PRIVATE_KEY"
}
},
system: {
loggerOptions: {
loggerCallback(loglevel, message, containsPii) {
console.log(message);
},
piiLoggingEnabled: false,
logLevel: msal.LogLevel.Verbose,
}
}
};
const cca = new msal.ConfidentialClientApplication(msalConfig);
const msalClientCredentialRequest = {
scopes: ["3db474b9-6a0c-4840-96ac-1fceb342124f/.default"],
skipCache: false,
};
module.exports.msalCca = cca;
module.exports.msalClientCredentialRequest = msalClientCredentialRequest;
// Acquire an access token
const result = await mainApp.msalCca.acquireTokenByClientCredential(mainApp.msalClientCredentialRequest);
if ( result ) {
accessToken = result.accessToken;
}
# Initialize MSAL library by using the following code
with open(config["azCertificatePrivateKeyLocation"], "rb") as file:
private_key = file.read()
with open(config["azCertificateLocation"]) as file:
public_certificate = file.read()
cert = load_pem_x509_certificate(data=bytes(public_certificate, 'UTF-8'), backend=default_backend())
thumbprint = (cert.fingerprint(hashes.SHA1()).hex())
msalCca = msal.ConfidentialClientApplication( config["azClientId"],
authority="https://login.microsoftonline.com/" + config["azTenantId"],
client_credential={
"private_key": private_key,
"thumbprint": thumbprint,
"public_certificate": public_certificate
}
)
# Acquire an access token
accessToken = ""
result = msalCca.acquire_token_for_client( scopes="3db474b9-6a0c-4840-96ac-1fceb342124f/.default" )
if "access_token" in result:
accessToken = result['access_token']
// Initialize MSAL library by using the following code
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(Files.readAllBytes(Paths.get(certKeyLocation)));
PrivateKey key = KeyFactory.getInstance("RSA").generatePrivate(spec);
java.io.InputStream certStream = (java.io.InputStream)new ByteArrayInputStream(Files.readAllBytes(Paths.get(certLocation)));
X509Certificate cert = (X509Certificate) CertificateFactory.getInstance("X.509").generateCertificate(certStream);
ConfidentialClientApplication app = ConfidentialClientApplication.builder(
clientId,
ClientCredentialFactory.createFromCertificate(key, cert))
.authority(authority)
.build();
// Acquire an access token
ClientCredentialParameters clientCredentialParam = ClientCredentialParameters.builder(
Collections.singleton(scope))
.build();
CompletableFuture<IAuthenticationResult> future = app.acquireToken(clientCredentialParam);
IAuthenticationResult result = future.get();
return result.accessToken();
Chiamare l'API
Per rilasciare o verificare una credenziale verificabile:
Creare una richiesta HTTP POST all'API REST del servizio di richiesta. L'ID tenant non è più necessario nell'URL perché è presente come attestazione nel token di accesso.
Problema
POST https://verifiedid.did.msidentity.com/v1.0/verifiableCredentials/createIssuanceRequest
Verificare
POST https://verifiedid.did.msidentity.com/v1.0/verifiableCredentials/createPresentationRequest
Collegare il token di accesso come token di connessione all'intestazione di autorizzazione in una richiesta HTTP.
Authorization: Bearer <token>
Impostare l'intestazione Content-Type su Application/json.
Inviare la richiesta all'API REST del servizio di richiesta.
L'API del servizio di richiesta restituisce un codice 201 Created di stato HTTP in una chiamata riuscita. Se la chiamata API restituisce un errore, controllare la documentazione di riferimento sugli errori.
Esempio di richiesta di rilascio
Nell'esempio seguente viene illustrata una richiesta di rilascio delle credenziali verificabile. Per informazioni sul payload, vedere Specifica di rilascio dell'API REST del servizio di richiesta.
POST https://verifiedid.did.msidentity.com/v1.0/verifiableCredentials/createIssuanceRequest
Content-Type: application/json
Authorization: Bearer <token>
{...JSON payload...}
Nell'esempio seguente viene illustrata una richiesta di presentazione delle credenziali verificabile. Per informazioni sul payload, vedere Specifica della presentazione dell'API REST del servizio di richiesta.
POST https://verifiedid.did.msidentity.com/v1.0/verifiableCredentials/createPresentationRequest
Content-Type: application/json
Authorization: Bearer <token>
{...JSON payload...}
Il payload della richiesta contiene l'endpoint di callback di rilascio e presentazione . L'endpoint fa parte dell'applicazione Web e deve essere disponibile pubblicamente tramite il protocollo HTTPS. L'API servizio di richiesta chiama l'endpoint per informare l'app su determinati eventi. Ad esempio, tali eventi potrebbero essere quando un utente analizza il codice a matrice, usa il collegamento diretto all'app di autenticazione o termina il processo di presentazione.
Il diagramma seguente descrive la chiamata eseguita dall'app all'API REST del servizio di richiesta e ai callback all'applicazione.
Configurare l'endpoint per l'ascolto delle richieste HTTP POST in ingresso. Il frammento di codice seguente illustra come gestire la richiesta HTTP di callback di rilascio e come aggiornare di conseguenza l'interfaccia utente:
Non applicabile. Scegliere uno degli altri linguaggi di programmazione.
[HttpPost]
public async Task<ActionResult> IssuanceCallback()
{
try
{
string content = new System.IO.StreamReader(this.Request.Body).ReadToEndAsync().Result;
_log.LogTrace("callback!: " + content);
JObject issuanceResponse = JObject.Parse(content);
// More code here
if (issuanceResponse["code"].ToString() == "request_retrieved")
{
var cacheData = new
{
status = "request_retrieved",
message = "QR Code is scanned. Waiting for issuance...",
};
_cache.Set(state, JsonConvert.SerializeObject(cacheData));
// More code here
}
}