Encontramos el hallazgo a esta problema, al menos eso deseamos. Si tienes dudas puedes escribirlo en el apartado de comentarios, que con gusto te responderemos
Solución:
Un par de días más en esto y eventualmente resolví los problemas yo mismo, y también aprendí un poco más sobre cómo funciona Django.
El enlace que me faltaba era cómo/dónde los procesadores de contexto de los módulos Django (de terceros) pasan su contexto a la página que finalmente se representa. No me di cuenta de que las variables del paquete microsoft_auth (como el authorisation_url
utilizado en su plantilla) también eran accesibles para mí en cualquiera de mis plantillas de forma predeterminada. Sabiendo esto, pude implementar una versión un poco más simple del mismo proceso de inicio de sesión basado en JS que usa el panel de administración.
Suponiendo que cualquiera que lea esto en el futuro esté pasando por el mismo proceso (de aprendizaje) que yo (con este paquete en particular), podría adivinar las siguientes preguntas que tendrá…
El primero fue “He iniciado sesión con éxito… ¿cómo puedo hacer algo en nombre del usuario?”. Uno supondría que se le daría el token de acceso del usuario para usar en futuras solicitudes, pero al momento de escribir este paquete no parecía hacerlo de manera obvia de manera predeterminada. Los documentos para el paquete solo lo llevan al inicio de sesión en el panel de administración.
La respuesta (en mi opinión, no tan obvia) es que tienes que establecer MICROSOFT_AUTH_AUTHENTICATE_HOOK
a una función que se puede llamar en una autenticación exitosa. Se le pasará al usuario que inició sesión (modelo) y su objeto token JSON para que pueda hacer lo que desee. Después de algunas deliberaciones, opté por extender mi modelo de usuario usando AbstractUser
y simplemente mantenga el token de cada usuario con sus otros datos.
modelos.py
class User(AbstractUser):
access_token = models.CharField(max_length=2048, blank=True, null=True)
id_token = models.CharField(max_length=2048, blank=True, null=True)
token_expires = models.DateTimeField(blank=True, null=True)
aad.py
from datetime import datetime
from django.utils.timezone import make_aware
def store_token(user, token):
user.access_token = token["access_token"]
user.id_token = token["id_token"]
user.token_expires = make_aware(datetime.fromtimestamp(token["expires_at"]))
user.save()
configuración.py
MICROSOFT_AUTH_EXTRA_SCOPES = "User.Read"
MICROSOFT_AUTH_AUTHENTICATE_HOOK = "django_app.aad.store_token"
Nota la MICROSOFT_AUTH_EXTRA_SCOPES
configuración, que podría ser su segunda pregunta secundaria: los ámbitos predeterminados establecidos en el paquete como SCOPE_MICROSOFT = ["openid", "email", "profile"]
, y cómo agregar más no se hace obvio. necesitaba agregar User.Read
por lo menos. Tenga en cuenta que la configuración espera un string de ámbitos separados por espacios, no una lista.
Una vez que tenga el token de acceso, podrá realizar solicitudes a la API de Microsoft Graph. Su Graph Explorer es extremadamente útil para ayudar con esto.
Si guardas alguna desconfianza o forma de refinar nuestro noticia te recomendamos ejecutar un exégesis y con mucho placer lo ojearemos.