Compartir a través de


Adición de autenticación de usuario a aplicaciones java para Microsoft Graph

En este artículo, agregará la autenticación de usuario a la aplicación que creó en Compilación de aplicaciones java con Microsoft Graph. A continuación, use la API de usuario de Microsoft Graph para obtener el usuario autenticado.

Agregar autenticación de usuario

La biblioteca cliente de Identidad de Azure para Java proporciona muchas TokenCredential clases que implementan flujos de token de OAuth2. El SDK de Microsoft Graph para Java usa esas clases para autenticar las llamadas a Microsoft Graph.

Configuración del cliente de Graph para la autenticación de usuario

Empiece por usar la DeviceCodeCredential clase para solicitar un token de acceso mediante el flujo de código del dispositivo.

  1. Cree un nuevo archivo en el directorio ./app/src/main/java/graphtutorial denominado Graph.java y agregue el código siguiente a ese archivo.

    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. Agregue una definición de clase graph vacía.

    public class Graph {
    }
    
  3. Agregue el código siguiente a la clase 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. Reemplace la función vacía initializeGraph en App.java por lo siguiente.

    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());
        }
    }
    

Este código declara dos propiedades privadas, un DeviceCodeCredential objeto y un GraphServiceClient objeto . La InitializeGraphForUserAuth función crea una nueva instancia de DeviceCodeCredentialy, a continuación, usa esa instancia para crear una nueva instancia de GraphServiceClient. Cada vez que se realiza una llamada API a Microsoft Graph a través de _userClient, usa la credencial proporcionada para obtener un token de acceso.

Prueba de DeviceCodeCredential

A continuación, agregue código para obtener un token de acceso de DeviceCodeCredential.

  1. Agregue la siguiente función a la clase 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. Reemplace la función vacía displayAccessToken en App.java por lo siguiente.

    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. Compile y ejecute la aplicación. Escriba 1 cuando se le solicite una opción. La aplicación muestra una dirección URL y un código de dispositivo.

    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. Abra un explorador y vaya a la dirección URL que se muestra. Escriba el código proporcionado e inicie sesión.

    Importante

    Tenga en cuenta cualquier cuenta de Microsoft 365 existente que haya iniciado sesión en el explorador al navegar a https://microsoft.com/devicelogin. Use características del explorador como perfiles, modo invitado o modo privado para asegurarse de autenticarse como la cuenta que quiere usar para las pruebas.

  5. Una vez completado, vuelva a la aplicación para ver el token de acceso.

    Sugerencia

    Solo con fines de validación y depuración, puede descodificar tokens de acceso de usuario (solo para cuentas profesionales o educativas) mediante el analizador de tokens en línea de Microsoft en https://jwt.ms. El análisis del token puede ser útil si se producen errores de token al llamar a Microsoft Graph. Por ejemplo, comprobar que la scp notificación del token contiene los ámbitos de permiso de Microsoft Graph esperados.

Obtener usuario

Ahora que la autenticación está configurada, puede realizar la primera llamada de Microsoft Graph API. Agregue código para obtener el nombre y la dirección de correo electrónico del usuario autenticado.

  1. Abra Graph.java y agregue la siguiente función a la Graph clase .

    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. Reemplace la función vacía greetUser en App.java por lo siguiente.

    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 ejecuta la aplicación ahora, después de iniciar sesión, le da la bienvenida por su nombre.

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

Código explicado

Tenga en cuenta el código de la greetUser función . Son solo unas pocas líneas, pero hay algunos detalles clave que debe tener en cuenta.

Acceso a 'me'

La función usa el generador de _userClient.me solicitudes, que compila una solicitud para obtener la API de usuario . Esta API es accesible de dos maneras:

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

En este caso, el código llama al punto de conexión de API GET /me . Este punto de conexión es un método abreviado para obtener el usuario autenticado sin conocer su identificador de usuario.

Nota:

Dado que el GET /me punto de conexión de API obtiene el usuario autenticado, solo está disponible para las aplicaciones que usan la autenticación de usuario. Las aplicaciones de autenticación de solo aplicación no pueden acceder a este punto de conexión.

Solicitud de propiedades específicas

La función usa la select propiedad en la configuración de la solicitud para especificar el conjunto de propiedades que necesita. Esta propiedad agrega el parámetro de consulta $select a la llamada API.

Tipo de valor devuelto fuertemente tipado

La función devuelve un com.microsoft.graph.models.User objeto deserializado a partir de la respuesta JSON de la API. Dado que el código usa select, solo las propiedades solicitadas tienen valores en el objeto devuelto User . Todas las demás propiedades tienen valores predeterminados.

Paso siguiente