Signerad HTTP-begäran

MSAL.js tillhandahåller klassen SignedHttpRequest som hjälp för att underlätta skapandet av signerade HTTP-begäranden (SHR) för innehåll (t.ex. token) som hämtas utanför MSAL.js. Detta gör det möjligt för program att använda samma kryptering och cachelagring MSAL.js använder för åtkomsttoken proof-of-possession för sina egna nyttolaster.

Obs! Klassen SignedHttpRequest är avsedd för avancerade användningsfall där den inbyggda funktionen för bevis på innehav av åtkomsttoken inte kan användas. Ett exempel på dessa användningsfall inkluderade Microsoft Entra ID- eller MSA-åtkomsttoken som inhämtats utanför bandet från MSAL.js samt åtkomsttoken för arbetsbelastning.

Krav

Om du vill använda API:et SignedHttpRequest måste ett program:

  1. Skicka vidare tumavtrycket för den offentliga nyckeln som returneras till servern som utfärdar nyttolasten, och den servern måste inkludera tumavtrycket i den signerade nyttolasten. Detta är vanligtvis en signerad JWT.
  2. Tillhandahåll nyttolastdata och den offentliga nyckelns ursprungliga tumavtryck tillbaka till MSAL.
  3. Resursservern som SHR:en är avsedd för måste förstå hur SHR:en och den interna nyttolasten ska avkodas och valideras.

Parametrar för Microsoft Entra

För token som utfärdats av Microsoft Entra ID eller MSA måste program inkludera ytterligare frågeparametrar i sina tokenbegäranden:

  • req_cnf : Base64-kodad sträng inklusive tumavtrycket för offentlig nyckel.
  • token_type: Ange pop för att indikera att detta är ett proof-of-possession-flöde.

Sample

Programanvändning

api.ts

import { SignedHttpRequest } from "@azure/msal-browser";

const resourceRequestUri = "https://api.contoso.com/my-api";
const resourceRequestMethod = "GET";

// Instantiate the token binding class. There may be configuration options possible in the future.
const signedHttpRequest = new SignedHttpRequest({
    resourceRequestUri, 
    resourceRequestMethod
});

// Use MSAL to generate and cache the keys, and return the public key thumbprint to the app.
const publicKeyThumbprint = await signedHttpRequest.generatePublicKeyThumbprint();

// Application acquires the payload to the be signed, providing the public key.
// This payload can be cached by the application, if desired.
const payload = await fetchAccessTokenWithoutMsal(publicKeyThumbprint);

// Application invokes custom business logic to acquire nonce (optional)
const nonce = await fetchServerNonce();

// Use MSAL to generate the pop token for the payload.
// This popToken should be used immediately and not be cached by the application.
const popToken = await signedHttpRequest.signRequest(payload, publicKeyThumbprint, { nonce });

// Initiate http request using pop token
const headers = new Headers();
headers.append("Authorization", `PoP ${popToken}`);

const options = {
    method: resourceRequestMethod,
    headers
};

const response = await fetch(resourceRequestUri, options);
const json = await response.json();

// Delete keys from cache
await signedHttpRequest.removeKeys(publicKeyThumbprint);

servernonser

SignedHttpRequest API:et stöder möjligheten att ange anpassade anspråk i SHR, inklusive nonce, till exempel via server nonce. Utför följande steg för att hämta en server-nonce:

  1. Generera den publika nyckelns tumavtryck och hämta den bundna payloaden.
  2. Anropa SignedHttpRequest.signRequest() utan att ange ett nonce-värde. Detta genererar en SHR med en anspråkspost nonce som genereras av biblioteket (för närvarande ett GUID).
  3. Anropa nätverksbegäran med hjälp av SHR till resursservern.
  4. Resursservern svarar med ett fel och ett nytt nonce värde som ska användas i en rubrik.
  5. Programmet måste parsa den här headern och anropa SignedHttpRequest.signRequest() igen, den här gången genom att skicka med det parsade nonce-värdet (i framtiden kommer MSAL att tillhandahålla en hjälpfunktion för att parsa headern).
  6. Skicka nätverksbegäran på nytt med hjälp av SHR till resursservern.