Accès à l’API Application Insights avec l’authentification Microsoft Entra

Vous pouvez soumettre une demande de requête en utilisant le point de terminaison Azure Monitor Application Insights https://api.applicationinsights.io. Pour accéder au point de terminaison, vous devez vous authentifier par le biais de Microsoft Entra ID.

Configurer l’authentification

Pour accéder à l’API, vous devez inscrire une application cliente auprès de Microsoft Entra ID, puis demander un jeton.

  1. Inscrivez une application dans Microsoft Entra ID.

  2. Dans la page de présentation de l’application, sélectionnez Autorisations API.

  3. Sélectionnez Ajouter une autorisation.

  4. Sous l’onglet API utilisées par mon organisation, recherchez Application Insights, puis sélectionnez API Application Insights dans la liste.

  5. Sélectionnez Autorisations déléguées.

  6. Cochez la case Data.Read.

  7. Sélectionnez Ajouter des autorisations.

Maintenant que votre application est inscrite et autorisée à utiliser l’API, accordez-lui l’accès à votre ressource Application Insights.

  1. Dans la page de présentation de votre Ressource Application Insights, sélectionnez Contrôle d’accès (IAM).

  2. Sélectionnez Ajouter une attribution de rôle.

  3. Sélectionnez le rôle Lecteur, puis sélectionnez Membres.

  4. Dans l’onglet Membres, sélectionnez Sélectionner des membres.

  5. Entrez le nom de votre application dans la zone Sélectionner.

  6. Sélectionnez votre application, puis choisissez Sélectionner.

  7. Sélectionnez Vérifier + attribuer.

  8. Après avoir configuré Active Directory et accordé les autorisations, demandez un jeton d’autorisation.

Notes

Pour cet exemple, nous avons appliqué le rôle Lecteur. Ce rôle est l’un des nombreux rôles intégrés et pourrait inclure des autorisations dont vous n’avez pas besoin. Des rôles et des autorisations plus précis peuvent être créés.

Demander un jeton d’autorisation

Avant de commencer, vérifiez que vous disposez de toutes les valeurs requises pour que la requête aboutisse. Toutes les requêtes nécessitent :

  • Votre identifiant de locataire Microsoft Entra.
  • Votre ID d’application Application Insights – Si vous utilisez actuellement des clés API, il s’agit du même ID d’application.
  • Votre identifiant client Microsoft Entra pour l’application.
  • Une clé secrète client Microsoft Entra pour l’application.

L’API Application Insights prend en charge l’authentification Microsoft Entra avec trois flux OAuth2 Microsoft Entra ID différents :

  • Informations d'identification du client
  • Code d’autorisation.
  • Implicite

Flux des informations d’identification du client

Dans le flux d’informations d’identification du client, le jeton est utilisé avec le point de terminaison Application Insights. Une seule requête est effectuée pour recevoir un jeton, avec les informations d’identification fournies pour votre application à l’étape précédente lorsque vous inscrivez une application dans Microsoft Entra ID.

Utilisez le point de terminaison https://api.applicationinsights.io.

URL du jeton d’informations d’identification du client (requête POST)

    POST /<your-tenant-id>/oauth2/token
    Host: https://login.microsoftonline.com
    Content-Type: application/x-www-form-urlencoded
    
    grant_type=client_credentials
    &client_id=<app-client-id>
    &resource=https://api.applicationinsights.io
    &client_secret=<app-client-secret>

Une demande qui aboutit reçoit un jeton d’accès dans la réponse :

    {
        token_type": "Bearer",
        "expires_in": "86399",
        "ext_expires_in": "86399",
        "access_token": ""eyJ0eXAiOiJKV1QiLCJ.....Ax"
    }

Utilisez le jeton dans les demandes adressées au point de terminaison Application Insights :

    POST /v1/apps/yous_app_id/query?timespan=P1D
    Host: https://api.applicationinsights.io
    Content-Type: application/json
    Authorization: Bearer <your access token>

    Body:
    {
    "query": "requests | take 10"
    }

Exemple de réponse :

  "tables": [
    {
      "name": "PrimaryResult",
      "columns": [
        {
          "name": "timestamp",
          "type": "datetime"
        },
        {
          "name": "id",
          "type": "string"
        },
        {
          "name": "source",
          "type": "string"
        },
        {
          "name": "name",
          "type": "string"
        },
        {
          "name": "url",
          "type": "string"
        },
        {
          "name": "success",
          "type": "string"
        },
        {
          "name": "resultCode",
          "type": "string"
        },
        {
          "name": "duration",
          "type": "real"
        },
        {
          "name": "performanceBucket",
          "type": "string"
        },
        {
          "name": "customDimensions",
          "type": "dynamic"
        },
        {
          "name": "customMeasurements",
          "type": "dynamic"
        },
        {
          "name": "operation_Name",
          "type": "string"
        },
        {
          "name": "operation_Id",
          "type": "string"
        },
        {
          "name": "operation_ParentId",
          "type": "string"
        },
        {
          "name": "operation_SyntheticSource",
          "type": "string"
        },
        {
          "name": "session_Id",
          "type": "string"
        },
        {
          "name": "user_Id",
          "type": "string"
        },
        {
          "name": "user_AuthenticatedId",
          "type": "string"
        },
        {
          "name": "user_AccountId",
          "type": "string"
        },
        {
          "name": "application_Version",
          "type": "string"
        },
        {
          "name": "client_Type",
          "type": "string"
        },
        {
          "name": "client_Model",
          "type": "string"
        },
        {
          "name": "client_OS",
          "type": "string"
        },
        {
          "name": "client_IP",
          "type": "string"
        },
        {
          "name": "client_City",
          "type": "string"
        },
        {
          "name": "client_StateOrProvince",
          "type": "string"
        },
        {
          "name": "client_CountryOrRegion",
          "type": "string"
        },
        {
          "name": "client_Browser",
          "type": "string"
        },
        {
          "name": "cloud_RoleName",
          "type": "string"
        },
        {
          "name": "cloud_RoleInstance",
          "type": "string"
        },
        {
          "name": "appId",
          "type": "string"
        },
        {
          "name": "appName",
          "type": "string"
        },
        {
          "name": "iKey",
          "type": "string"
        },
        {
          "name": "sdkVersion",
          "type": "string"
        },
        {
          "name": "itemId",
          "type": "string"
        },
        {
          "name": "itemType",
          "type": "string"
        },
        {
          "name": "itemCount",
          "type": "int"
        }
      ],
      "rows": [
        [
          "2018-02-01T17:33:09.788Z",
          "|0qRud6jz3k0=.c32c2659_",
          null,
          "GET Reports/Index",
          "http://fabrikamfiberapp.azurewebsites.net/Reports",
          "True",
          "200",
          "3.3833",
          "<250ms",
          "{\"_MS.ProcessedByMetricExtractors\":\"(Name:'Requests', Ver:'1.0')\"}",
          null,
          "GET Reports/Index",
          "0qRud6jz3k0=",
          "0qRud6jz3k0=",
          "Application Insights Availability Monitoring",
          "9fc6738d-7e26-44f0-b88e-6fae8ccb6b26",
          "us-va-ash-azr_9fc6738d-7e26-44f0-b88e-6fae8ccb6b26",
          null,
          null,
          "AutoGen_49c3aea0-4641-4675-93b5-55f7a62d22d3",
          "PC",
          null,
          null,
          "52.168.8.0",
          "Boydton",
          "Virginia",
          "United States",
          null,
          "fabrikamfiberapp",
          "RD00155D5053D1",
          "cf58dcfd-0683-487c-bc84-048789bca8e5",
          "fabrikamprod",
          "5a2e4e0c-e136-4a15-9824-90ba859b0a89",
          "web:2.5.0-33031",
          "051ad4ef-0776-11e8-ac6e-e30599af6943",
          "request",
          "1"
        ],
        [
          "2018-02-01T17:33:15.786Z",
          "|x/Ysh+M1TfU=.c32c265a_",
          null,
          "GET Home/Index",
          "http://fabrikamfiberapp.azurewebsites.net/",
          "True",
          "200",
          "716.2912",
          "500ms-1sec",
          "{\"_MS.ProcessedByMetricExtractors\":\"(Name:'Requests', Ver:'1.0')\"}",
          null,
          "GET Home/Index",
          "x/Ysh+M1TfU=",
          "x/Ysh+M1TfU=",
          "Application Insights Availability Monitoring",
          "58b15be6-d1e6-4d89-9919-52f63b840913",
          "emea-se-sto-edge_58b15be6-d1e6-4d89-9919-52f63b840913",
          null,
          null,
          "AutoGen_49c3aea0-4641-4675-93b5-55f7a62d22d3",
          "PC",
          null,
          null,
          "51.141.32.0",
          "Cardiff",
          "Cardiff",
          "United Kingdom",
          null,
          "fabrikamfiberapp",
          "RD00155D5053D1",
          "cf58dcfd-0683-487c-bc84-048789bca8e5",
          "fabrikamprod",
          "5a2e4e0c-e136-4a15-9824-90ba859b0a89",
          "web:2.5.0-33031",
          "051ad4f0-0776-11e8-ac6e-e30599af6943",
          "request",
          "1"
        ]
      ]
    }
  ]
}

Flux du code d’autorisation

Le flux OAuth2 principal pris en charge est celui qui fait appel à des codes d’autorisation. Avec cette méthode, l’acquisition d’un jeton avec lequel appeler l’API Azure Monitor Application Insights nécessite deux requêtes HTTP. Il y a deux URL, avec un point de terminaison par requête. Ces formats sont décrits dans les sections suivantes.

URL du code d’autorisation (requête GET)

    GET https://login.microsoftonline.com/YOUR_Azure AD_TENANT/oauth2/authorize?
    client_id=<app-client-id>
    &response_type=code
    &redirect_uri=<app-redirect-uri>
    &resource=https://api.applicationinsights.io

Lorsque vous adressez une requête à l’URL d’autorisation, l’ID de client (client_id) est l’ID d’application de votre application Microsoft Entra, copié depuis le menu des propriétés de l’application. L’URI de redirection (redirect_uri) est l’URL de connexion/page d’accueil de la même application Microsoft Entra. Quand une demande aboutit, ce point de terminaison vous redirige vers la page de connexion que vous avez fournie à l’inscription avec le code d’autorisation ajouté à l’URL. Voir l’exemple suivant :

    http://<app-client-id>/?code=AUTHORIZATION_CODE&session_state=STATE_GUID

À ce stade, vous avez obtenu un code d’autorisation, dont vous avez besoin pour demander un jeton d’accès.

URL du jeton de code d’autorisation (requête POST)

    POST /YOUR_Azure AD_TENANT/oauth2/token HTTP/1.1
    Host: https://login.microsoftonline.com
    Content-Type: application/x-www-form-urlencoded
    
    grant_type=authorization_code
    &client_id=<app client id>
    &code=<auth code fom GET request>
    &redirect_uri=<app-client-id>
    &resource=https://api.applicationinsights.io
    &client_secret=<app-client-secret>

Toutes les valeurs sont les mêmes qu’avant, avec quelques ajouts. Le code d’autorisation est le même que celui que vous avez reçu dans la requête précédente après une redirection réussie. Le code est combiné avec la clé obtenue depuis l’application Microsoft Entra. Si vous n’avez pas enregistré la clé, vous pouvez la supprimer, puis en créer une depuis l’onglet Clés du menu Microsoft Entra. La réponse est une chaîne JSON qui contient le jeton avec le schéma suivant. Les types sont indiqués pour les valeurs de jeton.

Exemple de réponse :

    {
        "access_token": "eyJ0eXAiOiJKV1QiLCJ.....Ax",
        "expires_in": "3600",
        "ext_expires_in": "1503641912",
        "id_token": "not_needed_for_app_insights",
        "not_before": "1503638012",
        "refresh_token": "eyJ0esdfiJKV1ljhgYF.....Az",
        "resource": "https://api.applicationinsights.io",
        "scope": "Data.Read",
        "token_type": "bearer"
    }

C’est la partie jeton d’accès de cette réponse que vous présentez à l’API Application Insights dans l’en-tête Authorization: Bearer. Vous pouvez également utiliser le jeton d’actualisation à l’avenir pour acquérir un nouveau jeton d’accès (access_token) et un nouveau jeton d’actualisation (refresh_token) quand les vôtres sont périmés. Pour cette requête, le format et le point de terminaison sont les suivants :

    POST /YOUR_AAD_TENANT/oauth2/token HTTP/1.1
    Host: https://login.microsoftonline.com
    Content-Type: application/x-www-form-urlencoded
    
    client_id=<app-client-id>
    &refresh_token=<refresh-token>
    &grant_type=refresh_token
    &resource=https://api.applicationinsights.io
    &client_secret=<app-client-secret>

Exemple de réponse :

    {
      "token_type": "Bearer",
      "expires_in": "3600",
      "expires_on": "1460404526",
      "resource": "https://api.applicationinsights.io",
      "access_token": "eyJ0eXAiOiJKV1QiLCJ.....Ax",
      "refresh_token": "eyJ0esdfiJKV1ljhgYF.....Az"
    }

Flux de code implicite

L’API Application Insights prend en charge le flux implicite OAuth2. Pour ce processus, une seule requête est requise, mais aucun jeton d’actualisation ne peut être acquis.

URL d’autorisation du code implicite

    GET https://login.microsoftonline.com/YOUR_AAD_TENANT/oauth2/authorize?
    client_id=<app-client-id>
    &response_type=token
    &redirect_uri=<app-redirect-uri>
    &resource=https://api.applicationinsights.io

Une requête qui aboutit produit une redirection vers votre URI de redirection avec le jeton dans l’URL :

    http://YOUR_REDIRECT_URI/#access_token=YOUR_ACCESS_TOKEN&token_type=Bearer&expires_in=3600&session_state=STATE_GUID

Ce jeton d’accès (access_token) peut être utilisé comme valeur d’en-tête Authorization: Bearer quand il est transmis à l’API Application Insights pour autoriser les demandes.