Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo, agregará autenticación de usuario a la aplicación que creó en Compilación de aplicaciones de Python 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 Python proporciona muchas TokenCredential
clases que implementan flujos de token de OAuth2. El SDK de Microsoft Graph para Python (versión preliminar) 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.
Abra graph.py y reemplace todo su contenido por el código siguiente.
from configparser import SectionProxy from azure.identity import DeviceCodeCredential from msgraph import GraphServiceClient from msgraph.generated.users.item.user_item_request_builder import UserItemRequestBuilder from msgraph.generated.users.item.mail_folders.item.messages.messages_request_builder import ( MessagesRequestBuilder) from msgraph.generated.users.item.send_mail.send_mail_post_request_body import ( SendMailPostRequestBody) from msgraph.generated.models.message import Message from msgraph.generated.models.item_body import ItemBody from msgraph.generated.models.body_type import BodyType from msgraph.generated.models.recipient import Recipient from msgraph.generated.models.email_address import EmailAddress class Graph: settings: SectionProxy device_code_credential: DeviceCodeCredential user_client: GraphServiceClient def __init__(self, config: SectionProxy): self.settings = config client_id = self.settings['clientId'] tenant_id = self.settings['tenantId'] graph_scopes = self.settings['graphUserScopes'].split(' ') self.device_code_credential = DeviceCodeCredential(client_id, tenant_id = tenant_id) self.user_client = GraphServiceClient(self.device_code_credential, graph_scopes)
Este código declara dos propiedades privadas, un
DeviceCodeCredential
objeto y unGraphServiceClient
objeto . La__init__
función crea una nueva instancia deDeviceCodeCredential
y, a continuación, usa esa instancia para crear una nueva instancia deGraphServiceClient
. Cada vez que se realiza una llamada API a Microsoft Graph a través deuser_client
, usa la credencial proporcionada para obtener un token de acceso.Agregue la siguiente función a graph.py.
async def get_user_token(self): graph_scopes = self.settings['graphUserScopes'] access_token = self.device_code_credential.get_token(graph_scopes) return access_token.token
Reemplace la función vacía
display_access_token
de main.py por lo siguiente.async def display_access_token(graph: Graph): token = await graph.get_user_token() print('User token:', token, '\n')
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.Python 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.
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.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.
Agregue la siguiente función a graph.py.
async def get_user(self): # Only request specific properties using $select query_params = UserItemRequestBuilder.UserItemRequestBuilderGetQueryParameters( select=['displayName', 'mail', 'userPrincipalName'] ) request_config = UserItemRequestBuilder.UserItemRequestBuilderGetRequestConfiguration( query_parameters=query_params ) user = await self.user_client.me.get(request_configuration=request_config) return user
Reemplace la función vacía
greet_user
de main.py por lo siguiente.async def greet_user(graph: Graph): user = await graph.get_user() if user: print('Hello,', user.display_name) # For Work/school accounts, email is in mail property # Personal accounts, email is in userPrincipalName print('Email:', user.mail or user.user_principal_name, '\n')
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 get_user
función . Son solo unas pocas líneas, pero hay algunos detalles clave que debe tener en cuenta.
Acceso a 'me'
La función compila una solicitud a la API Get user . 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 el parámetro de consulta $select para especificar el conjunto de propiedades que necesita. Microsoft Graph devuelve solo las propiedades solicitadas en la respuesta. En get_user
, la adición $select
se realiza con el select
parámetro en el MeRequestBuilderGetQueryParameters
objeto .