Partager via


Ajouter l’authentification utilisateur aux applications Java pour Microsoft Graph

Dans cet article, vous allez ajouter l’authentification utilisateur à l’application que vous avez créée dans Générer des applications Java avec Microsoft Graph. Vous utilisez ensuite l’API utilisateur Microsoft Graph pour obtenir l’utilisateur authentifié.

Ajouter l’authentification utilisateur

La bibliothèque de client Azure Identity pour Java fournit de nombreuses TokenCredential classes qui implémentent des flux de jetonS OAuth2. Le Kit de développement logiciel (SDK) Microsoft Graph pour Java utilise ces classes pour authentifier les appels à Microsoft Graph.

Configurer le client Graph pour l’authentification utilisateur

Commencez par utiliser la DeviceCodeCredential classe pour demander un jeton d’accès à l’aide du flux de code de l’appareil.

  1. Créez un fichier dans le répertoire ./app/src/main/java/graphtutorial nommé Graph.java et ajoutez le code suivant à ce fichier.

    package graphtutorial;
    
    import java.util.List;
    import java.util.Properties;
    import java.util.function.Consumer;
    
    import com.azure.core.credential.AccessToken;
    import com.azure.core.credential.TokenRequestContext;
    import com.azure.identity.DeviceCodeCredential;
    import com.azure.identity.DeviceCodeCredentialBuilder;
    import com.azure.identity.DeviceCodeInfo;
    import com.microsoft.graph.models.BodyType;
    import com.microsoft.graph.models.EmailAddress;
    import com.microsoft.graph.models.ItemBody;
    import com.microsoft.graph.models.Message;
    import com.microsoft.graph.models.MessageCollectionResponse;
    import com.microsoft.graph.models.Recipient;
    import com.microsoft.graph.models.User;
    import com.microsoft.graph.serviceclient.GraphServiceClient;
    import com.microsoft.graph.users.item.sendmail.SendMailPostRequestBody;
    
  2. Ajoutez une définition de classe Graph vide.

    public class Graph {
    }
    
  3. Ajoutez ce code à la classe Graph.

    private static Properties _properties;
    private static DeviceCodeCredential _deviceCodeCredential;
    private static GraphServiceClient _userClient;
    
    public static void initializeGraphForUserAuth(Properties properties, Consumer<DeviceCodeInfo> challenge) throws Exception {
        // Ensure properties isn't null
        if (properties == null) {
            throw new Exception("Properties cannot be null");
        }
    
        _properties = properties;
    
        final String clientId = properties.getProperty("app.clientId");
        final String tenantId = properties.getProperty("app.tenantId");
        final String[] graphUserScopes = properties.getProperty("app.graphUserScopes").split(",");
    
        _deviceCodeCredential = new DeviceCodeCredentialBuilder()
            .clientId(clientId)
            .tenantId(tenantId)
            .challengeConsumer(challenge)
            .build();
    
        _userClient = new GraphServiceClient(_deviceCodeCredential, graphUserScopes);
    }
    
  4. Remplacez la fonction vide initializeGraph dans App.java par ce qui suit.

    private static void initializeGraph(Properties properties) {
        try {
            Graph.initializeGraphForUserAuth(properties,
                challenge -> System.out.println(challenge.getMessage()));
        } catch (Exception e)
        {
            System.out.println("Error initializing Graph for user auth");
            System.out.println(e.getMessage());
        }
    }
    

Ce code déclare deux propriétés privées, un DeviceCodeCredential objet et un GraphServiceClient objet . La InitializeGraphForUserAuth fonction crée un instance de DeviceCodeCredential, puis utilise cette instance pour créer un instance de GraphServiceClient. Chaque fois qu’un appel d’API est effectué à Microsoft Graph via , _userClientil utilise les informations d’identification fournies pour obtenir un jeton d’accès.

Tester deviceCodeCredential

Ensuite, ajoutez du code pour obtenir un jeton d’accès à partir de .DeviceCodeCredential

  1. Ajoutez la fonction suivante à la classe Graph.

    public static String getUserToken() throws Exception {
        // Ensure credential isn't null
        if (_deviceCodeCredential == null) {
            throw new Exception("Graph has not been initialized for user auth");
        }
    
        final String[] graphUserScopes = _properties.getProperty("app.graphUserScopes").split(",");
    
        final TokenRequestContext context = new TokenRequestContext();
        context.addScopes(graphUserScopes);
    
        final AccessToken token = _deviceCodeCredential.getTokenSync(context);
        return token.getToken();
    }
    
  2. Remplacez la fonction vide displayAccessToken dans App.java par ce qui suit.

    private static void displayAccessToken() {
        try {
            final String accessToken = Graph.getUserToken();
            System.out.println("Access token: " + accessToken);
        } catch (Exception e) {
            System.out.println("Error getting access token");
            System.out.println(e.getMessage());
        }
    }
    
  3. Générez et exécutez l’application. Entrez 1 lorsque vous êtes invité à entrer une option. L’application affiche une URL et un code d’appareil.

    Java Graph Tutorial
    
    Please choose one of the following options:
    0. Exit
    1. Display access token
    2. List my inbox
    3. Send mail
    4. Make a Graph call
    1
    To sign in, use a web browser to open the page https://microsoft.com/devicelogin and
    enter the code RB2RUD56D to authenticate.
    
  4. Ouvrez un navigateur et accédez à l’URL affichée. Entrez le code fourni et connectez-vous.

    Importante

    Gardez à l’esprit tous les comptes Microsoft 365 existants qui sont connectés à votre navigateur lorsque vous accédez à https://microsoft.com/devicelogin. Utilisez les fonctionnalités du navigateur telles que les profils, le mode invité ou le mode privé pour vous assurer que vous vous authentifiez en tant que compte que vous envisagez d’utiliser pour les tests.

  5. Une fois terminé, revenez à l’application pour voir le jeton d’accès.

    Conseil

    À des fins de validation et de débogage uniquement, vous pouvez décoder les jetons d’accès utilisateur (pour les comptes professionnels ou scolaires uniquement) à l’aide de l’analyseur de jetons en ligne de Microsoft à l’adresse https://jwt.ms. L’analyse de votre jeton peut être utile si vous rencontrez des erreurs de jeton lors de l’appel de Microsoft Graph. Par exemple, vérifier que la revendication dans le scp jeton contient les étendues d’autorisation Microsoft Graph attendues.

Obtenir un utilisateur

Maintenant que l’authentification est configurée, vous pouvez effectuer votre premier appel microsoft API Graph. Ajoutez du code pour obtenir le nom et l’adresse e-mail de l’utilisateur authentifié.

  1. Ouvrez Graph.java et ajoutez la fonction suivante à la Graph classe .

    public static User getUser() throws Exception {
        // Ensure client isn't null
        if (_userClient == null) {
            throw new Exception("Graph has not been initialized for user auth");
        }
    
        return _userClient.me().get(requestConfig -> {
            requestConfig.queryParameters.select = new String[] {"displayName", "mail", "userPrincipalName"};
        });
    }
    
  2. Remplacez la fonction vide greetUser dans App.java par ce qui suit.

    private static void greetUser() {
        try {
            final User user = Graph.getUser();
            // For Work/school accounts, email is in mail property
            // Personal accounts, email is in userPrincipalName
            final String email = user.getMail() == null ? user.getUserPrincipalName() : user.getMail();
            System.out.println("Hello, " + user.getDisplayName() + "!");
            System.out.println("Email: " + email);
        } catch (Exception e) {
            System.out.println("Error getting user");
            System.out.println(e.getMessage());
        }
    }
    

Si vous exécutez l’application maintenant, une fois que vous vous êtes connecté, l’application vous accueille par son nom.

Hello, Megan Bowen!
Email: MeganB@contoso.com

Explication du code

Considérez le code dans la greetUser fonction . Il ne s’agit que de quelques lignes, mais il y a quelques détails clés à noter.

Accès à « moi »

La fonction utilise le générateur de _userClient.me requêtes, qui génère une requête à l’API Get user . Cette API est accessible de deux façons :

GET /me
GET /users/{user-id}

Dans ce cas, le code appelle le point de terminaison d’API GET /me . Ce point de terminaison est une méthode de raccourci permettant d’obtenir l’utilisateur authentifié sans connaître son ID d’utilisateur.

Remarque

Étant donné que le GET /me point de terminaison d’API obtient l’utilisateur authentifié, il est disponible uniquement pour les applications qui utilisent l’authentification utilisateur. Les applications d’authentification d’application uniquement ne peuvent pas accéder à ce point de terminaison.

Demande de propriétés spécifiques

La fonction utilise la select propriété sur la configuration de la demande pour spécifier le jeu de propriétés dont elle a besoin. Cette propriété ajoute le paramètre de requête $select à l’appel d’API.

Type de retour fortement typé

La fonction retourne un com.microsoft.graph.models.User objet désérialisé à partir de la réponse JSON de l’API. Étant donné que le code utilise select, seules les propriétés demandées ont des valeurs dans l’objet retourné User . Toutes les autres propriétés ont des valeurs par défaut.

Étape suivante