Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ten dokument zawiera pełne informacje dotyczące punktów końcowych HTTP udostępnianych przez zestaw Microsoft Entra SDK dla identyfikatora AgentID.
Specyfikacja interfejsu API
Specyfikacja interfejsu OpenAPI: dostępna w lokalizacji /openapi/v1.json (środowisko programistyczne) i w repozytorium: https://github.com/AzureAD/microsoft-identity-web/blob/master/src/Microsoft.Identity.Web.Sidecar/OpenAPI/Microsoft.Identity.Web.AgentID.json
Jego zastosowania to:
- Generowanie kodu klienta
- Weryfikowanie żądań
- Odnajdywanie dostępnych punktów końcowych
Omówienie punktu końcowego
| Endpoint | Metody | Przeznaczenie | Wymagane uwierzytelnianie |
|---|---|---|---|
/Validate |
GET | Weryfikowanie tokenu elementu nośnego dla ruchu przychodzącego i zwracanie oświadczeń | Tak |
/AuthorizationHeader/{serviceName} |
GET | Weryfikowanie tokenu przychodzącego (jeśli istnieje) i uzyskiwanie nagłówka autoryzacji dla podrzędnego interfejsu API | Tak |
/AuthorizationHeaderUnauthenticated/{serviceName} |
GET | Uzyskiwanie nagłówka autoryzacji (tożsamości aplikacji lub agenta) bez tokenu przychodzącego użytkownika | Tak |
/DownstreamApi/{serviceName} |
GET, POST, PUT, PATCH, DELETE | Weryfikowanie tokenu przychodzącego (jeśli istnieje) i wywoływanie interfejsu API podrzędnego przy użyciu automatycznego pozyskiwania tokenu | Tak |
/DownstreamApiUnauthenticated/{serviceName} |
GET, POST, PUT, PATCH, DELETE | Wywoływanie podrzędnego interfejsu API (tylko tożsamość aplikacji lub agenta) | Tak |
/healthz |
GET | Sonda kondycji (gotowość/gotowość) | Nie. |
/openapi/v1.json |
GET | Dokument OpenAPI 3.0 | Nie (tylko deweloperskie) |
Authentication
Wszystkie punkty końcowe pozyskiwania i walidacji tokenu wymagają tokenu elementu nośnego w nagłówku Authorization , chyba że jawnie oznaczone jako nieuwierzytelnione:
GET /AuthorizationHeader/Graph
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...
Tokeny są weryfikowane względem skonfigurowanych ustawień identyfikatora entra firmy Microsoft (dzierżawa, odbiorcy, wystawca, zakresy, jeśli są włączone).
/Validate
Weryfikuje token elementu nośnego dla ruchu przychodzącego i zwraca jego oświadczenia.
Żądanie
GET /Validate HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...
Pomyślna odpowiedź (200)
{
"protocol": "Bearer",
"token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
"claims": {
"aud": "api://your-api-id",
"iss": "https://sts.windows.net/tenant-id/",
"iat": 1234567890,
"nbf": 1234567890,
"exp": 1234571490,
"acr": "1",
"appid": "client-id",
"appidacr": "1",
"idp": "https://sts.windows.net/tenant-id/",
"oid": "user-object-id",
"tid": "tenant-id",
"scp": "access_as_user",
"sub": "subject",
"ver": "1.0"
}
}
Przykłady błędów
// 400 Bad Request - No token
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "Bad Request",
"status": 400,
"detail": "No token found"
}
// 401 Unauthorized - Invalid token
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "Unauthorized",
"status": 401
}
/AuthorizationHeader/{serviceName}
Uzyskuje token dostępu dla skonfigurowanego podrzędnego interfejsu API i zwraca go jako wartość nagłówka autoryzacji. Jeśli token elementu nośnego użytkownika jest dostarczany dla ruchu przychodzącego, jest używany protokół OBO (delegowany); w przeciwnym razie mają zastosowanie wzorce kontekstowe aplikacji (jeśli włączono).
Parametr ścieżki
-
serviceName— Nazwa podrzędnego interfejsu API w konfiguracji
Parametry zapytań
Przesłonięcia standardowe
| Parameter | Typ | Description | Example |
|---|---|---|---|
optionsOverride.Scopes |
string[] | Zastępowanie skonfigurowanych zakresów (powtarzalne) | ?optionsOverride.Scopes=User.Read&optionsOverride.Scopes=Mail.Read |
optionsOverride.RequestAppToken |
typ logiczny (boolowski) | Wymuszanie tokenu tylko dla aplikacji (pomiń OBO) | ?optionsOverride.RequestAppToken=true |
optionsOverride.AcquireTokenOptions.Tenant |
ciąg | Zastępowanie identyfikatora dzierżawy | ?optionsOverride.AcquireTokenOptions.Tenant=tenant-guid |
optionsOverride.AcquireTokenOptions.PopPublicKey |
ciąg | Włączanie funkcji PoP/SHR (klucz publiczny base64) | ?optionsOverride.AcquireTokenOptions.PopPublicKey=base64key |
optionsOverride.AcquireTokenOptions.PopClaims |
ciąg | Dodatkowe oświadczenia poP (JSON) | ?optionsOverride.AcquireTokenOptions.PopClaims={"nonce":"abc"} |
Tożsamość agenta
| Parameter | Typ | Description | Example |
|---|---|---|---|
AgentIdentity |
ciąg | Identyfikator aplikacji agenta (klienta) | ?AgentIdentity=11111111-2222-3333-4444-555555555555 |
AgentUsername |
ciąg | Główna nazwa użytkownika (agent delegowany) | ?AgentIdentity=<id>&AgentUsername=user@contoso.com |
AgentUserId |
ciąg | Identyfikator obiektu użytkownika (agent delegowany) | ?AgentIdentity=<id>&AgentUserId=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee |
Zasady:
-
AgentUsernamelubAgentUserIdwymagajAgentIdentity(agent użytkownika). -
AgentUsernameiAgentUserIdwzajemnie się wykluczają. -
AgentIdentityalone = autonomiczny agent. -
AgentIdentity+ token przychodzący użytkownika = agent delegowany.
Przykłady
Żądanie podstawowe:
GET /AuthorizationHeader/Graph HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...
GET /AuthorizationHeader/Graph?optionsOverride.RequestAppToken=true HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...
GET /AuthorizationHeader/Graph?AgentIdentity=agent-id HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...
Odpowiedź
{
"authorizationHeader": "Bearer eyJ0eXAiOiJKV1QiLCJhbGc..."
}
Odpowiedź poP/SHR:
{
"authorizationHeader": "PoP eyJ0eXAiOiJhdCtqd3QiLCJhbGc..."
}
/AuthorizationHeaderUnauthenticated/{serviceName}
Takie samo zachowanie i parametry, jak /AuthorizationHeader/{serviceName} i żadne tokeny użytkownika przychodzącego nie są oczekiwane. Służy do uzyskiwania tożsamości tylko aplikacji lub autonomicznej/agenta bez kontekstu użytkownika. Pozwala uniknąć narzutów związanych z walidacją tokenu użytkownika.
Żądanie
GET /AuthorizationHeaderUnauthenticated/Graph HTTP/1.1
Odpowiedź
{
"authorizationHeader": "Bearer eyJ0eXAiOiJKV1QiLCJhbGc..."
}
/DownstreamApi/{serviceName}
Uzyskuje token dostępu i wykonuje żądanie HTTP do podrzędnego interfejsu API. Zwraca kod stanu, nagłówki i treść z odpowiedzi podrzędnej. Obsługuje wzorce tożsamości użytkowników OBO, tylko dla aplikacji lub agenta.
Parametr ścieżki
-
serviceName— Skonfigurowano nazwę podrzędnego interfejsu API.
Dodatkowe parametry zapytania (oprócz /AuthorizationHeader parametrów)
| Parameter | Typ | Description | Example |
|---|---|---|---|
optionsOverride.HttpMethod |
ciąg | Zastąpij metodę HTTP | ?optionsOverride.HttpMethod=POST |
optionsOverride.RelativePath |
ciąg | Dołącz ścieżkę względną do skonfigurowanego elementu BaseUrl | ?optionsOverride.RelativePath=me/messages |
optionsOverride.CustomHeader.<Name> |
ciąg | Dodawanie nagłówków niestandardowych | ?optionsOverride.CustomHeader.X-Custom=value |
Przekazywanie treści żądania
Treść jest przekazywana bez zmian:
POST /DownstreamApi/Graph?optionsOverride.RelativePath=me/messages HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...
Content-Type: application/json
{
"subject": "Hello",
"body": { "contentType": "Text", "content": "Hello world" }
}
Odpowiedź
{
"statusCode": 200,
"headers": {
"content-type": "application/json"
},
"content": "{\"@odata.context\":\"...\",\"displayName\":\"...\"}"
}
Błędy dublowania /AuthorizationHeader oraz kody stanu błędów podrzędnego interfejsu API.
/DownstreamApiUnauthenticated/{serviceName}
Taki sam jak /DownstreamApi/{serviceName} , ale nie jest weryfikowany żaden token użytkownika przychodzącego. Służy do obsługi operacji agenta autonomicznego lub tylko dla aplikacji.
/healthz
Podstawowy punkt końcowy sondy kondycji.
Odpowiedź
W dobrej kondycji (200):
HTTP/1.1 200 OK
Zła kondycja (503):
HTTP/1.1 503 Service Unavailable
/openapi/v1.json
Zwraca specyfikację interfejsu OpenAPI 3.0 (tylko środowisko programistyczne). Użyj polecenia , aby:
- Generowanie kodu klienta
- Weryfikowanie żądań
- Odnajdywanie punktów końcowych
Typowe wzorce błędów
Nieprawidłowe żądanie (400)
Brak nazwy usługi:
// 400 Bad Request - Missing service name
{ "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title": "Bad Request", "status": 400, "detail": "Service name is required" }
// 400 Bad Request - Invalid agent combination
{ "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title": "Bad Request", "status": 400, "detail": "AgentUsername and AgentUserId are mutually exclusive" }
// 401 Unauthorized - Invalid token
{ "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title": "Unauthorized", "status": 401 }
// 403 Forbidden - Missing scope
{ "type": "https://tools.ietf.org/html/rfc7231#section-6.5.3", "title": "Forbidden", "status": 403, "detail": "The scope 'access_as_user' is required" }
// 404 Not Found - Service not configured
{ "type": "https://tools.ietf.org/html/rfc7231#section-6.5.4", "title": "Not Found", "status": 404, "detail": "Downstream API 'UnknownService' not configured" }
// 500 Internal Server Error - Token acquisition failure
{ "type": "https://tools.ietf.org/html/rfc7231#section-6.6.1", "title": "Internal Server Error", "status": 500, "detail": "Failed to acquire token for downstream API" }
Przykład błędu biblioteki MSAL
{ "type": "https://tools.ietf.org/html/rfc7231#section-6.6.1", "title": "Internal Server Error", "status": 500, "detail": "MSAL.NetCore.invalid_grant: AADSTS50076: Due to a configuration change ...", "extensions": { "errorCode": "invalid_grant", "correlationId": "..." } }
Kompletna dokumentacja zastąpienia
optionsOverride.Scopes=<scope> # Repeatable
optionsOverride.RequestAppToken=<true|false>
optionsOverride.BaseUrl=<url>
optionsOverride.RelativePath=<path>
optionsOverride.HttpMethod=<method>
optionsOverride.AcquireTokenOptions.Tenant=<tenant-id>
optionsOverride.AcquireTokenOptions.AuthenticationScheme=<scheme>
optionsOverride.AcquireTokenOptions.CorrelationId=<guid>
optionsOverride.AcquireTokenOptions.PopPublicKey=<base64-key>
optionsOverride.AcquireTokenOptions.PopClaims=<json>
optionsOverride.CustomHeader.<Name>=<value>
AgentIdentity=<agent-client-id>
AgentUsername=<user-upn> # Requires AgentIdentity
AgentUserId=<user-object-id> # Requires AgentIdentity
Przykłady przesłonięcia
Zastąpić zakresy:
GET /AuthorizationHeader/Graph?optionsOverride.Scopes=User.Read&optionsOverride.Scopes=Mail.Read HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...
Ograniczanie szybkości
Zestaw Microsoft Entra SDK dla identyfikatora AgentID nie nakłada limitów szybkości. Obowiązujące limity pochodzą z:
- Ograniczanie przepływności usługi tokenu identyfikatora entra firmy Microsoft (nie powinno się zdarzyć, ponieważ token pamięci podręcznej zestawu SDK)
- Limity interfejsu API podrzędnego
- Wydajność pamięci podręcznej tokenu (zmniejsza wolumin pozyskiwania)
Najlepsze praktyki
- Preferuj konfigurację za pośrednictwem przesłonięć ad hoc.
- Zachowaj nazwy usług statyczne i deklaratywne.
- Zaimplementuj zasady ponawiania prób dla błędów przejściowych (HTTP 500/503).
- Przed wywołaniem sprawdź poprawność parametrów agenta.
- Identyfikatory korelacji dzienników na potrzeby śledzenia między usługami.
- Monitorowanie opóźnień pozyskiwania tokenu i współczynników błędów.
- Użyj sond kondycji na platformach aranżacji.